2015-09-10 86 views
0

我正在嘗試編寫一個函數,該函數接受const char*並遍歷它,直到它匹配const char* hello的第一個字符。然後打印它必須前進的字符數量和mth字符。截至目前,我得到它指向的地方,我想,但我似乎無法訪問它打印字符數組的值

const char* hello = "hello"; 
const char* no_bears = "ERROR: Message must contain 'THIS IS BEAR TERRITORY!' yeeee"; 

int is_commit_msg_ok(const char* msg) { 
    /* COMPLETE THE REST */ 
    int m = 0; 
    char* message = &msg[0]; 
    while (message[m] != hello[0]) { 
    if (message[m] == '\0') { 
     return 0; 
    } 
    m++; 

    } 
    printf("%d\n",m); 
    printf("%s\n", message[m]); \\ causes segmentation fault 

當我消息[M],但是,我得到一個segementation故障:11錯誤,我真的不知道如何解決這個問題?

+0

在故障點'm'的值是多少,緩衝區有多大'message'? – lurker

+0

''/ 0''應該是''\ 0''。這是一個複製錯誤還是在實際的代碼? – Barmar

+0

如果我把「abcdh」,那麼在分割的時刻m的值是5.「啊」它是2, – Cesar

回答

3

在這一行:

printf("%s\n", message[m]); 

messagechar*類型,以便message[m]char類型,但%s期望一個char*

將錯誤類型傳遞到printf()的方法是未定義的行爲。但它可能做的是將char的值解釋爲指針並嘗試讀取那裏的內存。由於它不是有效的指針,因此它會出現分段錯誤。

解決方案,使用%c,打印char

printf("%c\n", message[m]); 

如果您啓用警告,許多現代編譯器會警告您這些類型的錯誤。例如在GCC/Clang中,你應該使用-Wall

+3

或者,您可以使用'printf(「%s \ n」,message + m);'打印從m開始的字符串結尾。 –

+2

@SergeBallesta:是,或者等價地是'printf(「%s \ n」,&message [m]);'。 – rodrigo

+0

你們真棒。非常感謝你! – Cesar

1

您可以使用printf("%c\n", message[m]);,因爲您只打印單個字符而不是帶有「%s」的字符串。