使用toupper时面对分段错误()

时间:2015-05-22 07:13:03

标签: c gcc segmentation-fault getchar 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;
}

1 个答案:

答案 0 :(得分:4)

getchar()返回int。某些返回值可能不适合char

yn更改为int yn

然后,来自toupper()的{​​{3}}

  

int toupper(int c);

     

如果c不是无符号字符值或EOF,则这些函数的行为是未定义的。

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

FWIW,toupper()ctype.h的原型,你必须#include