当我写任何数字时,为什么输出始终为1?

时间:2017-02-07 20:13:32

标签: c

问题是:当我输入任何数字时,printf语句的结果总是1

这是代码: code in picture

#include <stdio.h>
#include <stdlib.h>

int main() {
    int i;
    printf("%d\n", scanf("%d", &i));
    return 0;
}

7 个答案:

答案 0 :(得分:6)

答案是1,因为您没有打印已扫描的号码。

而是按scanf打印返回的数字,这是它已成功处理的项目数。在您的情况下,该数字为1,因为您从输入中读取了一个项目。

要解决此问题,您需要将scanf移到单独的行上,检查其返回值为1,然后打印i的值:

if (scanf("%d",&i) == 1) {
    printf("%d\n", i);
} else {
    printf("Invalid input\n");
}

答案 1 :(得分:3)

总是仔细检查哪些函数返回并记住返回值通常会尝试告诉您函数是否成功/失败/等。

答案 2 :(得分:2)

您正在打印1的返回值而非项目。如果从scanf手册页中读取了一个数字,那么该值将为fscanf

  

返回值

     

如果在第一次转换(如果有)完成之前发生输入失败,EOF函数将返回宏printf("%d", i);的值。否则,该函数返回分配的输入项的数量,如果早期匹配失败,则可以少于提供的数量,甚至为零。

相反,请阅读该号码,然后将其打印出来{{1}}

答案 3 :(得分:1)

这就是你想要的东西(比你可能需要的东西稍微详细一点):

#include <stdio.h>
#include <stdlib.h>

int main() {
  int i;
  if( scanf( "%d",&i) != 1) {
    fprintf(stderr,"Oh noes! an error-wrong number of things read\n");
    exit(1);
  } // else: we read something into i
  printf("%d\n",i);
  return 0;
}

答案 4 :(得分:1)

这里的所有答案都指向正确的方向,“检查scanf的返回值”。

进一步说明,您应该知道标准C库中的大多数函数都有返回值,应该在运行时检查。

所以你按照这里的许多其他答案的描述来做到这一点。

但是,知道您的问题的答案可能在您的计算机上触手可及,甚至无需上网也很有用。

在命令行中输入以下内容以获取有关scanf的文档...

man -k scanf

然后,您应该获得与该主题相关的手册页列表,其中一个手册页将描述该函数的完整操作,包括返回值的工作方式。

答案 5 :(得分:0)

使用两个scanf项目尝试相同的代码,您将得到2作为输出而不是1。由于您只读取1个输入,因此返回1作为输出。与python等动态语言不同,您的代码需要预先输入实数。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int i;
    printf("%d\n", scanf("%d%d", &i,&i));
    return 0;
}

输出: 2(每次)

希望它有所帮助。

答案 6 :(得分:-1)

scanf将返回读取元素的数量。 printf也会发生同样的情况。例如,如果你写:

int number = printf("abcd\n");
printf("%d", number);

它将返回读取的元素数。