2013-11-21 174 views
1
時出現分段錯誤

擊中了!將字符串複製到

下面是我今天做的一個小程序。它需要一個字符串表,反轉所有字符串而不反轉表,然後對這些反轉的字符串進行排序,然後將它們反轉回來,最後打印整個表格。

我想知道爲什麼我不能將'slowo'字符串複製到指向strcmp的表中,但沒有成功。如果有人會在這種情況下找到解決分段錯誤的方法,我會很高興,但我真的想離開下面的方法。

感謝您的幫助! :)

編輯通過使用調試器我確定分割故障出現在strcpy的,如果說不清楚......

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

const int ROZMIAR=4; 
char* nieposortowane[]={"basia", "zosia", "ala", "genowefa"}; 

int porownaj(char* a, char* b) 
{ 
return strcmp(a,b); 
} 

void sortowanie(char** tablica, int N) 
{ 
int zamienione, i; 
char tmp; 

do 
{ 
    zamienione=0; 
    for(i=0;i<N-1;i++) 
     if(porownaj(nieposortowane[i], nieposortowane[i+1])>0) 
     { 

      tmp=**(tablica+i); 
      **(tablica+i)=**(tablica+(i+1)); 
      **(tablica+(i+1))=tmp; 

      zamienione=1; 
     } 
} 
while(zamienione); 
} 

void wypisz(char** tablica, int N) 
{ 
int i=0; 
for(i=0;i<N;i++) 
    printf("%s\n", *(tablica+i)); 
} 

void odwr(char** tablica, int N) 
{ 
int i, ln, c; 
int start, koniec; 
char temp; 

for(i=0;i<N;i++) 
{ 
    ln = strlen(tablica[i]); 
    char slowo[ln]; 
    strcpy(slowo,*(tablica+i)); 
    start=0; 
    koniec=ln-1; 
    for(c=0;c<(ln/2);c++) 
    { 
     temp =slowo[start]; 
     slowo[start]=slowo[koniec]; 
     slowo[koniec]=temp; 
     start++; 
     koniec--; 
    } 
    strcpy(*(tablica+i), slowo); 
} 
} 

int main() 
{ 
printf("Przed sortowaniem: \n"); 
wypisz(nieposortowane, ROZMIAR); 

odwr(nieposortowane, ROZMIAR); 
sortowanie(nieposortowane, ROZMIAR); 
odwr(nieposortowane, ROZMIAR); 

printf("Po sortowaniu babelkowym: \n"); 
wypisz(nieposortowane, ROZMIAR); 

return 0; 
} 
+1

「BASIA」是字符串文字。字符串文字重寫禁止。 – BLUEPIXY

回答

0

AFAICS,您要修改字符串:存儲在只讀存儲器

char* nieposortowane[]={"basia", "zosia", "ala", "genowefa"}; 

這些都是字符串常量;任何嘗試修改它們(例如,通過反轉它們)都將失敗。

我用你原來的代碼重現了崩潰。該代碼的修訂不會崩潰;它會在您的排序代碼中進入無限循環。我沒有調試過你的代碼部分。

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

const int ROZMIAR=4; 
char basia[] = "basia"; 
char zosia[] = "zosia"; 
char ala[] = "ala"; 
char genowefa[] = "genowefa"; 
char* nieposortowane[]={basia, zosia, ala, genowefa}; 

int porownaj(char* a, char* b) 
{ 
return strcmp(a,b); 
} 

void sortowanie(char** tablica, int N) 
{ 
int zamienione, i; 
char tmp; 

do 
{ 
    zamienione=0; 
    for(i=0;i<N-1;i++) 
     if(porownaj(nieposortowane[i], nieposortowane[i+1])>0) 
     { 

      tmp=**(tablica+i); 
      **(tablica+i)=**(tablica+(i+1)); 
      **(tablica+(i+1))=tmp; 

      zamienione=1; 
     } 
} 
while(zamienione); 
} 

void wypisz(char** tablica, int N) 
{ 
int i=0; 
for(i=0;i<N;i++) 
    printf("%s\n", *(tablica+i)); 
} 

void odwr(char** tablica, int N) 
{ 
int i, ln, c; 
int start, koniec; 
char temp; 

for(i=0;i<N;i++) 
{ 
    ln = strlen(tablica[i]); 
    char slowo[ln]; 
    strcpy(slowo,*(tablica+i)); 
    start=0; 
    koniec=ln-1; 
    for(c=0;c<(ln/2);c++) 
    { 
     temp =slowo[start]; 
     slowo[start]=slowo[koniec]; 
     slowo[koniec]=temp; 
     start++; 
     koniec--; 
    } 
    strcpy(*(tablica+i), slowo); 
} 
} 

int main() 
{ 
printf("Przed sortowaniem: \n"); 
wypisz(nieposortowane, ROZMIAR); 

odwr(nieposortowane, ROZMIAR); 
wypisz(nieposortowane, ROZMIAR); 

sortowanie(nieposortowane, ROZMIAR); 
wypisz(nieposortowane, ROZMIAR); 
odwr(nieposortowane, ROZMIAR); 
wypisz(nieposortowane, ROZMIAR); 

printf("Po sortowaniu babelkowym: \n"); 
wypisz(nieposortowane, ROZMIAR); 

return 0; 
} 

輸出示例:

Przed sortowaniem: 
basia 
zosia 
ala 
genowefa 
aisab 
aisoz 
ala 
afewoneg 

我不得不之後打斷,但你可以看到字符串成功逆轉。

你需要整理一個更一般的解決方案;像我那樣命名單個陣列對於小型固定設置很容易,但通常不會。一種可能性是使用strdup()到每個字符串複製到分配的空間:

enum { SIZE_NPSW = sizeof(nieposortowane)/sizeof(nieposortowane[0] }; 

for (i = 0; i < SIZE_NPSW; i++) 
    nieposortowane[i] = strdup(nieposortowane[i]); 
+0

是的!這解決了問題。由於全局聲明的變化,我必須稍微改變氣泡分類功能,但現在它可以工作。謝謝 :) – wnerw

2

當分配slowo,您應該計算時加1的strlen結果分配的大小。這是爲了容納終止空字符,它不包含在字符串的長度(由strlen返回)中,但必須包含在其總分配大小中。

+0

如果這是一個問題,我會覺得非常愚蠢。雖然我通過將ln加1來固定分配,但運行此程序仍然會產生分段錯誤... – wnerw

+0

這是因爲BLUEPIXY正確:您無法寫入[字符串字符串](http://bytes.com/topic/c /答案/ 213252串串字面值可能,任何人 - 解釋 - 我)! PS:波蘭? – paulsm4

+0

是的;)波蘭語,在華沙理工大學學習。 – wnerw

相關問題