对getchar和scanf感到困惑

时间:2014-01-07 11:36:26

标签: c printf getchar

我对getchar()scanf()的使用感到很困惑。这两者有什么区别?

我知道scanf() [和家庭]从用户[或文件]中获取一个字符并将其保存到变量中,但是会立即执行此操作还是在按下某些内容后执行此操作(Enter )?

我真的不明白这段代码,我看到很多代码使用getchar()而且它们都让你在屏幕上输入你想要的任何内容并且没有响应,但当你按{{1}时它退出了。

enter

在这段代码中,我不能使用int j, ch; printf("please enter a number : \n"); while (scanf("%i", &j) != 1) { while((ch = getchar()) != '\n') ; printf("enter an integer: "); } 逐个字符来测试它吗?此外,这条线意味着什么?

scanf()

因为当我按下1时,按下2时没有任何不同?这件作品是做什么的?

当这条线发生的时候?

scanf("%i", &j) != 1

因为它永远不会发生。

6 个答案:

答案 0 :(得分:4)

嗯,scanf是一个多功能的效用函数,它可以根据格式字符串读取多种类型的数据,而getchar()只读取一个字符。

基本上,

char someCharacter = getchar();

相当于

char someCharacter;
scanf("%c", &someCharacter);

我不是百分百肯定,但是如果你只需要阅读一个字符,getchar()可能比scanf()“便宜”,因为处理格式字符串的开销不存在(这个如果你阅读很多字符,就像在一个巨大的for循环中一样,可能会有所作为。

关于第二个问题。

此代码:

scanf("%i", &j) != 1

表示您希望scanf读取变量“j”中的整数。如果成功读取,即流中的下一个输入实际上是一个整数,scanf将返回1,因为它正确读取并分配了1个整数。

有关scanf返回值的详细信息,请参阅 this SO question 最早的答案。

答案 1 :(得分:3)

while (scanf("%i", &j) != 1) {
    while((ch = getchar()) != '\n') ;
    printf("enter an integer: ");
}

以下是此代码的分解方式。

  1. scanf()使用输入流中的单个字符,直到它看到%i转换说明符 1 匹配的字符,并且不匹配的字符留在输入流中;
  2. scanf()尝试输入文本转换为适当类型的值;即,如果输入字符串"1234\n",它将转换为整数值1234,转换后的值将分配给变量j'\n'将留在输入流中;
  3. 如果输入字符串中没有与转换说明符匹配的字符(例如"abcd"),则不会执行任何转换,也不会为j分配任何内容;
  4. scanf()返回成功转化和分配的次数。
  5. 如果scanf()调用的结果不是1,则用户没有输入有效的整数字符串;
  6. 由于输入流中不包含不匹配的字符,我们需要先删除它们才能尝试其他scanf()调用,因此我们使用getchar()来消费字符,直到我们看到换行符,此时我们会提示用户再次尝试再次执行scanf()来电。

<小时/> 1。 %i转换说明符跳过任何前导空格,并接受八进制,十进制或十六进制格式的可选带符号整数常量。因此,它将接受[+|-]{0x[0-9a-fA-F]+ | 0[0-7]+ | [1-9][0-9]*}

形式的字符串

答案 2 :(得分:2)

scanf可以扫描任意格式的数据并将其解析为多种类型(整数,浮点,字符串等)。 getchar函数只获取一个字符并返回它。

表达式

scanf("%i", &j) != 1

从标准输入中读取(可能已签名的)整数,并将其存储在变量j中。然后,它会比较scanf函数的返回值(返回成功扫描的转换次数),并将其与1进行比较。这意味着如果scanf 没有读取或转换整数值,则表达式将为“true”。因此,只要scanf失败,循环就会继续循环。

您可能需要查看this scanf reference

printf没有发生可能是因为它永远不会发生(使用调试器来查找),或者它只是貌似没有发生但它确实是因为输出需要刷新。刷新输出可以通过打印换行符或使用fflush功能完成:

fflush(stdout);

答案 3 :(得分:2)

据我了解, getchar函数会一次读取您输入的字符。 scanf将读取所有类型的数据,并且对定义数据组更有用。 但是,就字符串而言,我的老师建议使用gets而不是scanf。这是因为scanf将停止在您输入的第一个空白区域“获取”数据,就像在句子中一样......

答案 4 :(得分:0)

据我所知,考虑到指定的输入格式,scanf将读取用户输入,直到第一个空格。但是,getchar只能读取一个字符。

scanf将返回已成功读取的格式列表的参数数量,如here所述。按1或2时获得相同的结果,因为%i格式说明符已成功读取它们。

答案 5 :(得分:0)

getchar一次从输入中读取一个char。其中scanf可以根据您指定的数据类型读取更多内容。

使用scanf()尝试使用fgets()不是一个好习惯,它比scanf更有效,更安全。