2015-05-22 18 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