打印输入的字符时,getchar/putchar会返回带问号的框

Dan*_*sen 2 c codeblocks character-encoding

在Windows 10(丹麦语)的Codeblocks中使用K&R中的代码示例.以下示例按预期工作:

#include <stdio.h>

int main() {
    char c = 'a';
    putchar(c);
}
Run Code Online (Sandbox Code Playgroud)

但是,下面打印一系列带有问号的方框,与我输入的字符数相同:

#include <stdio.h>

int main() {
    char c;

    while (c = getchar() != '\n') {
        putchar(c);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以它看起来像编码问题.运行时,会在标题中打开一个命令提示符,其中包含"C:\ Users\username\Desktop\filename.exe",我的用户名包含丹麦字符"å",后面用"Õ"替换.命令提示符使用CP 850字符集.

(顺便说一句,我没有检查字符是否等于EOF,因为这会产生奇怪的结果.按Enter键打印预期的盒子数,再加上一个\n,但它不会结束程序.)

hat*_*hat 7

您在这里看到了运算符优先级的问题.正如您在此图表中看到的那样,=优先级低于!=.

这意味着getchar() != '\n'首先评估.

对于编译器,您的代码如下所示:

#include <stdio.h>

int main() {
    char c;

    while (c = (getchar() != '\n')) { 
        putchar(c);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于'c'得到的值不正确(表达式的真/假评估),输出不正确,程序会给出你看到的行为,但是

#include <stdio.h>

int main() {
    char c;

    while ((c = getchar()) != '\n') { //<----notice brackets around c=getchar 
        putchar(c);
    }
}
Run Code Online (Sandbox Code Playgroud)

给出你期望的输出.这说明了您应该始终在这些表达式周围放置括号以确保安全.