【问题标题】:How can I get an int from stdio in C?如何从 C 中的 stdio 获取 int?
【发布时间】:2011-07-02 12:07:04
【问题描述】:

我在这方面遇到了很大的麻烦......

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

printf("got the number: %d", scanf("%d", &x));

输出

> 1234
got the number: 1

【问题讨论】:

  • 您获得1 的原因完全是巧合。 scanf 返回成功读取的值的数量,这就是它向您显示 1 的原因。尝试另一个数字,您会明白为什么。
  • 如果您需要强大的输入解决方案,请参阅stackoverflow.com/questions/4023895/…。我不反对接受的答案,scanf 很好(无论如何对于 this 情况,对于无限制的字符串条目来说不是这样),但你最终会想要一些可以用作通用的东西解决方案。通常最好从用户那里获取一个字符串然后sscanf 它来获取其他表示形式。
  • getchar() 在那里做什么?

标签: c stdio


【解决方案1】:

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

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

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

  1. stdin 文件已关闭或损坏,因此您什么也得不到。
  2. 用户输入的内容无效。

要检查这一点,您可以像这样从scanf 捕获返回码:

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

如果stdin在读取时遇到错误,result将是EOF,您可以像这样检查错误:

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

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

另一方面,如果用户输入了无效的内容,例如垃圾文本字符串,那么您需要从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
        ;
}

希望这会有所帮助!

编辑:针对更详细的问题,这里有一个更合适的答案。 :-)

这段代码的问题是当你写的时候

printf("got the number: %d", scanf("%d", &x));

这是从scanf 打印返回码,在流错误时为EOF,如果没有读取任何内容,则为0,否则为1。这意味着,特别是,如果您输入一个整数,这将始终打印 1,因为您打印的是来自 scanf 的状态代码,而不是您读取的数字。

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

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

希望这会有所帮助!

【讨论】:

  • 很抱歉,我没有就我的原始问题提供更多信息。我在上面做了更新。
  • @macek- 刚刚更新了这个以更详细地了解您的特定问题。你能看看这个,看看它是否有帮助?
  • 我们的答案非常相似,我只是决定删除我的。你的更好,更深入!也只是一个小小的挑剔,scanf 返回成功读取的项目数,因此如果您执行“%d %d”,它将返回 2。
  • @templateypedef,谢谢,谢谢!添加的解释非常有帮助:)
【解决方案2】:

典型的方式是scanf:

int input_value;

scanf("%d", &input_value);

但是,在大多数情况下,您希望检查您读取输入的尝试是否成功。 scanf 返回它成功转换的项目数,因此您通常希望将返回值与预期读取的项目数进行比较。在这种情况下,您希望阅读一项,因此:

if (scanf("%d", &input_value) == 1)
    // it succeeded
else
    // it failed

当然,所有scanf 家族(sscanffscanf 等)也是如此。

【讨论】:

    【解决方案3】:

    解决方案非常简单......您正在阅读 getchar() ,它为您提供输入缓冲区中的第一个字符,而 scanf 只是将它(真的不知道为什么)解析为整数,如果您忘记了getchar 一秒钟,它将读取整个缓冲区,直到换行符为止。

    printf("> ");
    int x;
    scanf("%d", &x);
    printf("got the number: %d", x);
    

    输出

    > [prompt expecting input, lets write:] 1234 [Enter]
    got the number: 1234
    

    【讨论】:

    • 这不太行.. 它只是打印 scanf() 的返回码,通常是 0 或 1。你想要:int x; scanf("%d", &x); printf("number: %d", x);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多