我对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
因为它永远不会发生。
答案 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: ");
}
以下是此代码的分解方式。
scanf()
使用输入流中的单个字符,直到它看到不与%i
转换说明符 1 匹配的字符,并且不匹配的字符留在输入流中;
scanf()
尝试将输入文本转换为适当类型的值;即,如果输入字符串"1234\n"
,它将转换为整数值1234
,转换后的值将分配给变量j
,'\n'
将留在输入流中;
"abcd"
),则不会执行任何转换,也不会为j
分配任何内容;
scanf()
返回成功转化和分配的次数。
scanf()
调用的结果不是1
,则用户没有输入有效的整数字符串;
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更有效,更安全。