C:scanf和getchar的行为差异

时间:2016-10-10 05:31:30

标签: c char int scanf getchar

我想在C中编写一个函数来读取字符,直到遇到换行符。我使用scanf和getchar编写了以下代码:

使用scanf的代码: while(scanf("%c",&x)!=EOF&&x!='\n'){....}

使用getchar的代码:while(((x=getchar())!=EOF)&&x!='\n'){....}

int x是在函数内声明的局部变量。第二个代码在读取字后停止(EG:" ADAM \ n"),而scanf代码不会中断循环并继续等待。

后来我发现在scanf之后,x的值是(2 ^ 7-1)*(2 ^ 8)+字符读取的ascii值(换行时为32522),而字符常量' \ n'那么比较失败了。

我的问题是为什么scanf指定一个值>读完' \ n'后32000到x,而getchar指定一个值10(与字符常量匹配' \ n')?

2 个答案:

答案 0 :(得分:0)

这里的关键区别在于Xamarin (Quartz Beta)行为:

1)通常scanf用于读取不同的数据类型(不仅scanf),例如char将读取整数并忽略所有“空格”字符(字符为''(空格),'\ t'(制表符)和'\ n'(新行))。

2)scanf("%d",&num)以及scanf("%c",&x)(如果输入了数字)将返回1 - 从scanf("%d",&num)读取的成功数据的数量。注意:如果stdin中没有数字,scanf("%d",&num)将返回0

答案 1 :(得分:0)

主要区别在于scanf确实跳过输入流中的空格字符,而getchar则返回它们。因此,您无法在scanf中看到输入中的换行符。 scanf的返回值也是成功转换变量的数量。

如果变量包含有效值(more details here),您需要检查scanf(...) == 1以查看。当scanf未转换所有输入变量时,未转换变量的值未定义。这就是为什么你在你的情况下看到x的奇怪值。这只是一些(或多或少)随机值,这是由于编译器将x分配给以前使用过的内存位置,并且仍然包含一些遗留数据。