对getchar和scanf感到困惑

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

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

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

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

在这段代码中我不能用scanf()来逐个字符地获取并测试它吗? 此外,这条线是什么意思?

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

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

当这条线发生的时候?

 printf("enter an integer: "); 

因为它永远不会发生

嗯, scanf是一个多function的实用程序函数,可以根据格式字符串读取多种类型的数据,而getchar()只读取一个字符。

基本上,

 char someCharacter = getchar(); 

相当于

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

我不是100%肯定,但是如果你只需要读取一个字符, getchar()可能比scanf()更“便宜”,因为处理格式字符串的开销不存在(如果你读的话,这可能算得上许多角色,比如一个巨大的for循环)。

对于第二个问题。

这段代码:

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

意味着你希望scanf读取变量’j’中的整数。 如果成功读取,即流中的下一个输入实际上是一个整数,则scanf将返回1,因为它正确读取并分配了1个整数。

有关scanf返回值的更多详细信息,请参阅此SO问题的最早答案。

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

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

表达方式

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

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

您可能想要检查此scanf参考 。

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

 fflush(stdout); 

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

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

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

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

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