2016-09-05 58 views
-5

我想製作一個程序,它接受「你好」的輸入並輸出「olleH」來反轉字符的順序。不過,我不斷收到分段錯誤,我不明白爲什麼C編程,分段錯誤核心轉儲

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

int main() 
{ 
    int i; 
    int size; 
    char s[100],a[100]; 

    printf("Enter the word you want to get reversed: "); 
    scanf("%s",s); 


    while(s[i]!='\0') 
{ 
    a[i]=s[i]; 
    i++; 
} 

size=sizeof(s); 

    while(i<sizeof(s)) 
    { 
     s[i]=a[size]; 

    } 

    printf("The reversed string is : %s",s); 


} 
+0

提示:'尺寸=的sizeof(一個或多個);'有錯... –

+0

'而(ⅰ的sizeof <(S)){S [I] =α[大小]; }'會導致未定義行爲的無限循環。 – haccks

+1

另外請注意''i'被用於未初始化,另一個漏洞是用於UP? – haccks

回答

0

的問題是在這個部分:

size=sizeof(s); 

while(i<sizeof(s)) 
{ 
    s[i]=a[size]; 
} 

sizeof(s)將是100,而從輸入讀取字符串可以小於如果您訪問s未初始化的部分,那麼這將是undefined。因此,您想使用strlen()來獲取字符串的實際大小並將其用於反轉。

請注意,scanf()在寫入時是不安全的(如果輸入的字符多於100個字符?)。建議使用fgets()代替。

0

反轉字符串的另一種簡單方法。

試試這個:

while(s[++i]!='\0'); // find the size of string 

    while(i>=0) 
    a[j++] = s[--i]; // reverse the string 

    a[j]='\0'; 
    printf("The reversed string is : %s",a); 
0

這個while循環

while(i<sizeof(s)) 
{ 
    s[i]=a[size]; 

} 

沒有意義,因爲指數i有指向輸入的字符串(只要它最初被正確初始化)以外的值並且循環是無限的,因爲我在循環中沒有改變(並且最初未初始化)並且該語句的右手錶達式

s[i]=a[size]; 

總是相同的,並再次指向數組外的內存。

考慮到程序中沒有使用在<string.h>中聲明的函數。所以標題可能會被刪除。

該程序可以看下面的方式

#include <stdio.h> 

#define N 100 

int main() 
{ 
    char s[N], d[N]; 

    printf("Enter the word you want to get reversed: "); 
    fgets(s, N, stdin); 

    size_t n = 0; 

    while (s[n] != '\0' && s[n] != '\n') n++; 

    for (size_t i = 0; i != n; i++) d[i] = s[n-i-1]; 
    d[n] = '\0'; 

    printf("The reversed string is : %s\n", d); 

    return 0; 
} 

可以逆轉的字符串不使用輔助陣列。例如

#include <stdio.h> 

#define N 100 

int main() 
{ 
    char s[N]; 

    printf("Enter the word you want to get reversed: "); 
    fgets(s, N, stdin); 

    size_t n = 0; 

    while (s[n] != '\0' && s[n] != '\n') n++; 
    s[n] = '\0'; 

    for (size_t i = 0; i < n/2; i++) 
    { 
     char c = s[i]; 
     s[i] = s[n-i-1]; 
     s[n-i-1] = c; 
    } 

    printf("The reversed string is : %s\n", s); 

    return 0; 
}