使用 toupper() 时遇到分段错误

Facing segmentation fault while using toupper()

以下方法会导致错误:

BOOL should_begin(void) {
    char yn;
    do {
        printf("Continue? [Y/N] ");
        yn = getchar();
        printf("\n");
        yn = toupper(yn);
        if (yn == 'N') {
            return FALSE;
        }
    } while (yn != 'Y');
    return TRUE;
}

代码正常执行,直到达到toupper(),此时出现段错误。我见过这样的问题,其中 toupper() 是在字符串的一部分上调用的,但只有当有人试图修改文字时才会这样。

那么是什么原因呢? char yn 不应该是只读的,对吧?这只是一个 char,一个字节的数据,我不是在读取整个字符串吗?


编辑

这是我的 main() 函数。

int main(int argc, char* argv[]) {

    /* just some printf()s with instructions */

    if (!should_begin()) {
        return 0;
    }

    /* then continue with rest of the program */

    return 0;
}

getchar()returns int。某些 return 值 可能 不适合 char

yn 更改为 int yn

然后,从 man page for toupper()

int toupper(int c);

If c is not an unsigned char value, or EOF, the behavior of these functions is undefined.

因此,在将 yn 传递给 toupper() 之前,您需要检查 EOF

FWIW,toupper() 的原型在 ctype.h 中,您必须 #include 相同。