我真搞不清楚的用法getchar()
和scanf()
。 什么是这两者之间的区别?
我知道, scanf()
[家庭]获得通过字符从用户[或文件],并将其保存到一个变量的字符,但不会立即或按东西(后做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
是一种多用途的实用功能,可以读取多种类型的数据的基础上,格式字符串,而getchar()
只读取一个字符。
基本上,
char someCharacter = getchar();
相当于
char someCharacter;
scanf("%c", &someCharacter);
我不是100%肯定,但如果你只需要读取一个字符, getchar()
可能会比“便宜” scanf()
为处理格式字符串不存在的开销(当你读到这可以指望的东西人物众多 ,像一个巨大的循环)。
对于第二个问题。
此代码:
scanf("%i", &j) != 1
意味着你要scanf
在变量“J”读取一个整数。 如果成功读取,也就是流中的下一个输入实际上是一个整数, scanf
将返回1,因为它正确地读出和分配1点的整数。
看到最古老的答案, 这太问题的更多细节scanf
的返回值。
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]*}
[+|-]{0x[0-9a-fA-F]+ | 0[0-7]+ | [1-9][0-9]*}
所述scanf
可以扫描任意格式的数据并解析它作为多种类型(整数,浮点,字符串等)。 该getchar
函数只是得到一个字符并返回它。
表达方式
scanf("%i", &j) != 1
读取来自标准输入(可能带符号)整数,并将其存储在变量j
。 然后,它比较的返回值scanf
函数(它返回成功扫描转换的数量),并将它与1
。 这意味着表达将是“真”,如果scanf
未读或转化的整数值。 所以循环将只要继续循环scanf
失败。
你可能要检查这个scanf
参考 。
那printf
不会发生可能是因为它永远不会发生(使用调试器来查找出来),或者它只是似乎不会发生,但它确实是因为输出需要被刷新。 冲洗输出通过印刷换行符完成任一,或用fflush
功能:
fflush(stdout);
据我了解,getchar函数将读取你的输入一次一个字符 。 scanf的将读取所有类型的数据 ,并且将更加有用定义的数据组。 然而,据串去,我的老师建议使用得到的,而不是scanf函数。 这是因为scanf函数会停在你投入了,就像是句子中的第一个空格“得”的数据...
据我所知, scanf
会读取用户输入,直到第一个空格,考虑指定的输入格式。 getchar
,然而,只读取单个字符。
scanf
会返回已成功读取的格式列表参数的个数,如解释在这里 。 按1或2时,因为两者都被成功地读你获得同样的结果%i
格式说明。
的getchar读取在从输入一次一个字符。 其中,作为scanf函数可以读到更多取决于数据U型指定。
它不是很好的做法,使用scanf()的请尝试使用与fgets(),它更加有效和安全比scanf函数。