2016-01-20 177 views
-2

你好夥計Stackoverflowers!C:有時會出現分段錯誤?

爲什麼下面的代碼有時會拋出Segmentation錯誤(即1/10次)?

控制檯:

輸入字符串

賽車

分段故障

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char string_buffer[21]; 
    int i, length; 
    int flag = 0; 

    print f("Input a string\n"); 
    scanf("%20s", string_buffer); 

    length = strlen(string_buffer); 

    for(i=0; i < length; i++) { 
     if(string_buffer[i] != string_buffer[length-i-1]) { 
     flag = 1; 
     break; 
     } 
    } 

    if(flag) { 
     printf("%sNot a Palindrome.\n"); 
    } 
    else { 
     printf("%sPalindrome.\n"); 
    } 
    return 0; 
} 
+0

這不會解決這個問題,但使用'的scanf(「%20S%N」,string_buffer,&長度)描述下的問題;'而不是'strlen的()'。 –

+1

很有可能是因爲它調用了未定義的行爲10/10次... – Olaf

+0

我會建議你使用fgets或getline而不是scanf,因爲你遇到這個問題的方式是因爲iharob指出的最後兩個printf –

回答

2

printf()陳述期望char *指針,你是不是傳遞一個。這會調用未定義的行爲。

更改此

if(flag) { 
    printf("%sNot a Palindrome.\n"); 
} 
else { 
    printf("%sPalindrome.\n"); 
} 

if (flag == 1) 
    printf("`%s' IS NOT a Palindrome.\n", string_buffer); 
else 
    printf("`%s' IS a Palindrome.\n", string_buffer); 

如果啓用編譯器警告你應該警告這一點。

這是您的代碼的改進版本與上述固定

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char string_buffer[21]; 
    int flag = 0; 
    int length; 

    if (scanf("%20s%n", string_buffer, &length) != 1) 
     return -1; 
    for (int i = 0 ; ((flag == 0) && (i < length)) ; ++i) 
     flag = (string_buffer[i] != string_buffer[length - i - 1]); 
    if (flag == 1) 
     printf("`%s' IS NOT a Palindrome.\n", string_buffer); 
    else 
     printf("`%s' IS a Palindrome.\n", string_buffer); 
    return 0; 
}