以下是get_line的函数定义: -
在开头跳过空白。
先停在白色空间。
int get_line (char* ch, int n)
{
if ( n <= 0)
return 0;
char c;
while ( isspace(c = getchar()));
int i = 0;
do {
ch[i++] = c;
if ( i == n)
break;
}while ( ! isspace(c = getchar()));
if ( c == '\n')
ch[i++] = '\n';
ch[i] = '\0';
return i;
}
int main()
{
char array[5];
get_line(array, 4);
printf("%s", array);
char c;
while ( (c = getchar()) != '\n'){
printf("\n%c", c);
}
return 0;
}
但是当我输入更多的字符然后大小并尝试使用最后一个while循环打印main中的剩余字符时,它会打印奇怪的字符,而不是按照函数的第四个规范的要求打印流中的剩余字符。请告诉我为什么会这样?
答案 0 :(得分:3)
看起来你与operator precedence发生了冲突。
在此声明中:
while ( c = getchar() != '\n'){
比较运算符!=
的优先级高于赋值运算符=
。因此,首先评估getchar() != '\n'
,因为它是布尔表达式,所以1
或0
将是1
或c = 1
。
假设下一个字符不是换行符,则值为1
。然后评估getchar() != '\n'
,并通过将值0
打印为char来继续循环。找到换行符后,c = 0
的计算结果为while ( (c = getchar()) != '\n'){
,然后评估<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="@android:anim/decelerate_interpolator">
<translate
android:fromXDelta="0%" android:toXDelta="0%"
android:fromYDelta="100%" android:toYDelta="0%"
android:duration="250" />
并退出循环。
您需要在此处添加括号以获得预期的操作顺序:
.box
答案 1 :(得分:2)
WhozCraig指出您的问题是运营商优先级。这就是:
while ( c = getchar() != '\n'){
printf("\n%c", c);
}
在while
语句的条件表达式中,首先评估expersion getchar() != '\n'
。然后将结果分配给c
。该表达式产生了对getchar()
的调用的比较结果,'\n'
检索下一个字符,并使用常量字符值!=
。
根据比较运算符\n
的实现方式,您可以获得奇怪的字符。请注意,C中的布尔值“true”定义为非零,布尔值“false”定义为零。例如,编译器从'getchar()
结果中减去call getchar
sub ax, 0x0d ' getchar result in ax; subtract \n from it
mov c, ax ' move result of subtraction to variable c
jz end_loop ' end loop if zero (= equal)
的字节值并测试非零是完全合法的。在汇编程序中,这看起来像:
numbers = text.scan(/([^A-Z|^"]{6,})/i).collect{|x| x[0].strip }