点击那里!
以下是我今天制作的一个小程序。它需要一个字符串表,在没有反转表的情况下反转所有字符串,然后对那些反转的字符串进行排序,然后将它们反转,最后打印整个表格。
我正在努力弄清楚为什么我不能复制“慢速”。在strcmp中指向的表中的字符串,但没有成功。如果有人在这种情况下找到修复Segmentation Fault的方法,我会很高兴,但我真的想留下下面的方法。
感谢您的帮助! :)
编辑通过使用调试器我确定分段错误出现在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;
}
答案 0 :(得分:2)
分配slowo
时,在计算要分配的大小时,应将strlen
的结果加1。这是为了容纳终止空字符,该字符不包含在字符串的 length 中(由strlen
返回),但必须包含在其总分配大小中。
答案 1 :(得分: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]);