如何获取流中的左侧字符?

how to get the left character in stream?

这里是get_line的函数定义:-

  1. 跳过开头的白色spaces。

  2. 停在第一个白色 space.

  3. 在第一个换行符处停止并将其放入数组中。
  4. 如果没有 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' 首先被评估,并且将是 10 因为它是一个布尔表达式。

假设下一个字符不是换行符,则值为 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)