我编写了一个函数来按字母顺序对字符串进行排序,但出现分段错误
I wrote a function to sort a string in alphabetical order but getting a segmentation fault
sort
和 swap
函数将指针作为参数,当我用 2 或 3 个字符串尝试它时它工作正常但超过三个它给出分段错误,请这是我的代码让我知道这里发生了什么以及为什么会出现此错误。
#include <stdio.h>
#include <string.h>
void get(int r, int c, char (*s)[c]);
void print(int r, int c, char (*s)[c]);
void sort(int r, int c, char (*s)[c]);
void swap(int c, char (*s)[c], char (*s1)[c]);
void main()
{
int r;
printf("\n\t enter no. : ");
scanf("%d", &r);
char s[r][31];
get(r,31,s);
sort(r,31,s);
printf("\n\tsorted list");
print(r,31,s);
}
void get(int r, int c, char (*s)[c])
{
int i, j;
for(i = 0; i < r; i++)
{
printf("\n\t");
scanf("%s", *(s+i));
}
}
void print(int r, int c, char (*s)[c])
{
int i, j;
for(i = 0; i < r; i++)
{
printf("\n\t%s", *(s+i));
}
}
void sort(int r, int c, char (*s)[c])
{
int i, j, k;
for(i = 0; i < r; i++)
{
for(j = 0, k = 1; j < r-1; j++, k++)
{
if(strcmp(*(s+j),*(s+k)) > 0)
{
swap(c, (s+j), (s+k));
}
}
}
}
void swap(int c, char (*s)[c], char (*s1)[c])
{
char (*t)[c];
strcpy(*t, *s);
strcpy(*s,*s1);
strcpy(*s1,*t);
}
t
是一个指针,因此需要对其进行初始化,这就是分段错误的原因,您需要分配和分配所需的内存,尽管更好的解决方案是简单地使它是一个数组:
void swap(int c, char (*s)[c], char (*s1)[c])
{
char t[c];
strcpy(t, *s);
strcpy(*s,*s1);
strcpy(*s1,t);
}
或
char (*t)[c] = malloc(sizeof *t); // you'll need stdlib.h
使用第二个选项,您必须释放内存:
free(t);
虽然我强烈建议第一个解决方案。
我还强烈建议在您的 get
函数中为 scanf
使用宽度限制器,否则您将面临缓冲区溢出和未定义行为的风险。
scanf("%30s", *(s+i));
// discard extra characters in case the input is larger than the destination buffer
while ((c = getchar()) != '\n' && c != EOF){}
注意 main
return 类型应该是 int
.
sort
和 swap
函数将指针作为参数,当我用 2 或 3 个字符串尝试它时它工作正常但超过三个它给出分段错误,请这是我的代码让我知道这里发生了什么以及为什么会出现此错误。
#include <stdio.h>
#include <string.h>
void get(int r, int c, char (*s)[c]);
void print(int r, int c, char (*s)[c]);
void sort(int r, int c, char (*s)[c]);
void swap(int c, char (*s)[c], char (*s1)[c]);
void main()
{
int r;
printf("\n\t enter no. : ");
scanf("%d", &r);
char s[r][31];
get(r,31,s);
sort(r,31,s);
printf("\n\tsorted list");
print(r,31,s);
}
void get(int r, int c, char (*s)[c])
{
int i, j;
for(i = 0; i < r; i++)
{
printf("\n\t");
scanf("%s", *(s+i));
}
}
void print(int r, int c, char (*s)[c])
{
int i, j;
for(i = 0; i < r; i++)
{
printf("\n\t%s", *(s+i));
}
}
void sort(int r, int c, char (*s)[c])
{
int i, j, k;
for(i = 0; i < r; i++)
{
for(j = 0, k = 1; j < r-1; j++, k++)
{
if(strcmp(*(s+j),*(s+k)) > 0)
{
swap(c, (s+j), (s+k));
}
}
}
}
void swap(int c, char (*s)[c], char (*s1)[c])
{
char (*t)[c];
strcpy(*t, *s);
strcpy(*s,*s1);
strcpy(*s1,*t);
}
t
是一个指针,因此需要对其进行初始化,这就是分段错误的原因,您需要分配和分配所需的内存,尽管更好的解决方案是简单地使它是一个数组:
void swap(int c, char (*s)[c], char (*s1)[c])
{
char t[c];
strcpy(t, *s);
strcpy(*s,*s1);
strcpy(*s1,t);
}
或
char (*t)[c] = malloc(sizeof *t); // you'll need stdlib.h
使用第二个选项,您必须释放内存:
free(t);
虽然我强烈建议第一个解决方案。
我还强烈建议在您的 get
函数中为 scanf
使用宽度限制器,否则您将面临缓冲区溢出和未定义行为的风险。
scanf("%30s", *(s+i));
// discard extra characters in case the input is larger than the destination buffer
while ((c = getchar()) != '\n' && c != EOF){}
注意 main
return 类型应该是 int
.