如何从C中的stdio获取int?

mač*_*ček 25 c stdio

这有很大的麻烦......

printf("> ");
int x = getchar();

printf("got the number: %d", scanf("%d", &x));
Run Code Online (Sandbox Code Playgroud)

产量

> 1234
got the number: 1
Run Code Online (Sandbox Code Playgroud)

tem*_*def 52

我不完全确定这是你正在寻找的,但如果你的问题是如何使用读取整数<stdio.h>,那么正确的语法是

int myInt;
scanf("%d", &myInt);
Run Code Online (Sandbox Code Playgroud)

当然,您需要进行大量的错误处理以确保其正常工作,但这应该是一个良好的开端.特别是,您需要处理其中的案例

  1. stdin文件被关闭或损坏,所以你什么都得不到.
  2. 用户输入无效的内容.

要检查这一点,您可以捕获返回代码,scanf如下所示:

int result = scanf("%d", &myInt);
Run Code Online (Sandbox Code Playgroud)

如果stdin在阅读时遇到错误,result将会EOF,并且您可以检查这样的错误:

int myInt;
int result = scanf("%d", &myInt);

if (result == EOF) {
    /* ... you're not going to get any input ... */
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果用户输入无效的内容(如垃圾文本字符串),则需要读取字符,stdin直到消耗所有违规输入为止.您可以按如下方式执行此操作,使用scanf如果未读取任何内容则返回0 的事实:

int myInt;
int result = scanf("%d", &myInt);

if (result == EOF) {
    /* ... you're not going to get any input ... */
}
if (result == 0) {
    while (fgetc(stdin) != '\n') // Read until a newline is found
        ;
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

编辑:回答更详细的问题,这是一个更合适的答案.:-)

这段代码的问题在于你写的时候

printf("got the number: %d", scanf("%d", &x));
Run Code Online (Sandbox Code Playgroud)

这是打印从返回代码scanf,这是EOF一个流错误,0如果没有被读取,以及1其他.这意味着,特别是,如果输入一个整数,这将始终打印,1因为您打印的是状态代码scanf,而不是您读取的数字.

要解决此问题,请将其更改为

int x;
scanf("%d", &x);
/* ... error checking as above ... */
printf("got the number: %d", x);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 我们的答案非常相似,我决定删除我的。你的更好,更深入!同样只是一个小小的挑剔,scanf 返回成功读取的项目数,因此如果您执行“%d %d”,它将返回 2。 (2认同)

Jer*_*fin 6

典型的方法是scanf:

int input_value;

scanf("%d", &input_value);
Run Code Online (Sandbox Code Playgroud)