如何获取流中的左侧字符?
how to get the left character in stream?
这里是get_line的函数定义:-
跳过开头的白色spaces。
停在第一个白色 space.
- 在第一个换行符处停止并将其放入数组中。
- 如果没有 space 可用,则留下字符。
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] = '[=10=]';
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 中的剩余字符时,它会打印奇怪的字符,而不是按照第四个规范的要求打印流中的剩余字符功能。请告诉我为什么会这样?
看起来你 运行 与 operator precedence 有冲突。
在此声明中:
while ( c = getchar() != '\n'){
比较运算符 !=
的优先级高于赋值运算符 =
。所以 getchar() != '\n'
首先被评估,并且将是 1
或 0
因为它是一个布尔表达式。
假设下一个字符不是换行符,则值为 1
。然后计算 c = 1
并通过将值 1
打印为字符来继续循环。当找到换行符时,getchar() != '\n'
计算为 0
,然后计算 c = 0
并退出循环。
您需要在此处添加括号以获得预期的操作顺序:
while ( (c = getchar()) != '\n'){
WhozCraig 指出您的问题是运算符优先级。这是发生了什么:
while ( c = getchar() != '\n'){
printf("\n%c", c);
}
在 while
语句的条件表达式中,首先计算表达式 getchar() != '\n'
。然后把这个的结果赋值给c
。该表达式产生调用 getchar()
的比较结果,它检索下一个字符,具有常量字符值 '\n'
.
根据比较运算符 !=
的实现方式,您可能会得到奇怪的字符。请注意,C 中的 Boolean 'true' 定义为非零,而 Boolean 'false' 定义为零。例如,编译器从 'getchar()
结果中减去 \n
的字节值并测试非零是完全合法的。在汇编程序中,这看起来像:
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)
这里是get_line的函数定义:-
跳过开头的白色spaces。
停在第一个白色 space.
- 在第一个换行符处停止并将其放入数组中。
- 如果没有 space 可用,则留下字符。
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] = '[=10=]';
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 中的剩余字符时,它会打印奇怪的字符,而不是按照第四个规范的要求打印流中的剩余字符功能。请告诉我为什么会这样?
看起来你 运行 与 operator precedence 有冲突。
在此声明中:
while ( c = getchar() != '\n'){
比较运算符 !=
的优先级高于赋值运算符 =
。所以 getchar() != '\n'
首先被评估,并且将是 1
或 0
因为它是一个布尔表达式。
假设下一个字符不是换行符,则值为 1
。然后计算 c = 1
并通过将值 1
打印为字符来继续循环。当找到换行符时,getchar() != '\n'
计算为 0
,然后计算 c = 0
并退出循环。
您需要在此处添加括号以获得预期的操作顺序:
while ( (c = getchar()) != '\n'){
WhozCraig 指出您的问题是运算符优先级。这是发生了什么:
while ( c = getchar() != '\n'){
printf("\n%c", c);
}
在 while
语句的条件表达式中,首先计算表达式 getchar() != '\n'
。然后把这个的结果赋值给c
。该表达式产生调用 getchar()
的比较结果,它检索下一个字符,具有常量字符值 '\n'
.
根据比较运算符 !=
的实现方式,您可能会得到奇怪的字符。请注意,C 中的 Boolean 'true' 定义为非零,而 Boolean 'false' 定义为零。例如,编译器从 'getchar()
结果中减去 \n
的字节值并测试非零是完全合法的。在汇编程序中,这看起来像:
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)