以下方法会导致错误:
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;
}
答案 0 :(得分:4)
getchar()
返回int
。某些返回值可能不适合char
。
将yn
更改为int yn
。
然后,来自toupper()
的{{3}}
int toupper(int c);
如果
c
不是无符号字符值或EOF
,则这些函数的行为是未定义的。
因此,在将EOF
传递给yn
之前,您需要检查toupper()
。
FWIW,toupper()
是ctype.h
的原型,你必须#include
。