对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: "); }
这是代码分解的方式。
-
scanf()
使用输入流中的单个字符,直到它看到与%i
转换说明符1不匹配的字符,并且在输入流中保留不匹配的字符; -
scanf()
尝试将输入文本转换为适当类型的值; 即,如果输入字符串"1234\n"
,它将被转换为整数值1234
,转换后的值将被赋值给变量j
,'\n'
将保留在输入流中; - 如果输入字符串中没有与转换说明符匹配的字符(例如
"abcd"
),则不执行任何转换,也不会为j
分配任何内容; -
scanf()
返回成功转换和分配的次数。 - 如果
scanf()
调用的结果不是1
,则用户没有输入有效的整数字符串; - 由于非匹配字符留在输入流中,我们需要先删除它们才能尝试另一个
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
没有发生可能是因为它永远不会发生(使用调试器来查找),或者它似乎没有发生,但它确实是因为输出需要刷新。 通过打印换行符或使用fflush
function来完成刷新输出:
fflush(stdout);
据我所知,getchar函数将一次读取您输入的一个字符 。 scanf将读取所有类型的数据 ,并且对定义数据组更有用。 但是,就字符串而言,我的老师建议使用gets而不是scanf。 这是因为scanf将停止在您输入的第一个空白区域“获取”数据,就像在句子中一样……
据我所知,考虑到指定的输入格式, scanf
将读取用户输入,直到第一个空格。 但是, getchar
只读取一个字符。
scanf
将返回已成功读取的格式列表的参数数量,如此处所述。 按1或2时获得相同的结果,因为%i
格式说明符已成功读取它们。
getchar一次从输入中读取一个char。 其中scanf可以根据您指定的数据类型读取更多内容。
使用scanf()尝试使用fgets()并不是一个好习惯,它比scanf更有效,更安全。