困惑的getchar和scanf(confused about getchar and scanf)

2019-10-19 04:51发布

我真搞不清楚的用法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: ");

因为它永远不会发生。

Answer 1:

好了, scanf是一种多用途的实用功能,可以读取多种类型的数据的基础上,格式字符串,而getchar()只读取一个字符。

基本上,

char someCharacter = getchar();

相当于

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

我不是100%肯定,但如果你只需要读取一个字符, getchar()可能会比“便宜” scanf()为处理格式字符串不存在的开销(当你读到这可以指望的东西人物众多 ,像一个巨大的循环)。

对于第二个问题。

此代码:

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

意味着你要scanf在变量“J”读取一个整数。 如果成功读取,也就是流中的下一个输入实际上是一个整数, scanf将返回1,因为它正确地读出和分配1点的整数。

看到最古老的答案, 这太问题的更多细节scanf的返回值。



Answer 2:

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]*} [+|-]{0x[0-9a-fA-F]+ | 0[0-7]+ | [1-9][0-9]*}



Answer 3:

所述scanf可以扫描任意格式的数据并解析它作为多种类型(整数,浮点,字符串等)。 该getchar函数只是得到一个字符并返回它。

表达方式

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

读取来自标准输入(可能带符号)整数,并将其存储在变量j 。 然后,它比较的返回值scanf函数(它返回成功扫描转换的数量),并将它与1 。 这意味着表达将是“真”,如果scanf 读或转化的整数值。 所以循环将只要继续循环scanf失败。

你可能要检查这个scanf参考 。

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

fflush(stdout);


Answer 4:

据我了解,getchar函数将读取你的输入一次一个字符 。 scanf的将读取所有类型的数据 ,并且将更加有用定义的数据组。 然而,据串去,我的老师建议使用得到的,而不是scanf函数。 这是因为scanf函数会停在你投入了,就像是句子中的第一个空格“得”的数据...



Answer 5:

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

scanf会返回已成功读取的格式列表参数的个数,如解释在这里 。 按1或2时,因为两者都被成功地读你获得同样的结果%i格式说明。



Answer 6:

的getchar读取在从输入一次一个字符。 其中,作为scanf函数可以读到更多取决于数据U型指定。

它不是很好的做法,使用scanf()的请尝试使用与fgets(),它更加有效和安全比scanf函数。



文章来源: confused about getchar and scanf
标签: c printf getchar