2013-11-21 68 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

相关问题