2015-05-22 19 views
0

下面的方法将导致错误:面对段故障,同时使用在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; 
} 
+0

这几乎是完整的代码。没有别的,但有一些#include和#define。 –

+1

我希望你没有错过'#包括',是吗? –

+0

第一号包括。 –

回答

4

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

变化yn变为int yn

然后,从man pagetoupper()

int toupper(int c);

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

所以,你需要传递yntoupper()之前检查EOF

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

+1

你说得对。如果一个实现使用'1 << CHAR_BITS'数组来盲目地存储char标志和索引'c',这可能导致分段错误。规范没有问题,这是程序员的责任。 –

+0

感谢@MohitJain先生的补充解释。 :-) –

+1

另一种修正:'int input = getchar(); if(input == EOF){error_handling(); } yn =(无符号字符)输入;' – Lundin