我想在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')?
答案 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分配给以前使用过的内存位置,并且仍然包含一些遗留数据。