问题是按字母顺序对给定的字符串输入进行升序排序。我为此编写了以下代码。但是在打印输入的名称之后,程序没有对字符串进行排序而是给出了段错误。我在这个问题上花了很多时间,但什么也想不通。任何帮助将不胜感激。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int x,i,j,length;
printf("Enter the number of names you want to sort.\n");
scanf("%d",&x);
char *names[x],*p,name[50],*t;
printf("Enter the names:\n");
for(i=0;i<x;i++)
{
scanf(" %[^\n]",name);
length = strlen(name);
p = (char *)malloc(length+1);
strcpy(p,name);
names[i] = p;
}
printf("Entered names are:\n\n");
for(i=0;i<x;i++)
{
printf("%s\n",names[i]);
}
printf("\n\nThe sorted names are:\n");
for(i=0;i<x-1;i++)
{
for(j=i+1;j<x;j++)
{
if(strcmp(names[i],names[j])>0)
{
strcpy(t,names[i]);
strcpy(names[i],names[j]);
strcpy(names[j],t);
}
}
}
for(i=0;i<x;i++)
{
printf("%s\n",names[i]);
}
return 0;
}
最佳答案
你没有分配 t
所以 strcpy(t,names[i])
会出现段错误。
您还可以使用 strdup()
1 来复制您的字符串(而不是 malloc()
和 strcpy()
)。
而且,由于您的数组是 char*
元素,您可以直接交换它们:
t=names[i];
names[i]=names[j];
names[j]=t;
关于您关于指针的问题,您可以将指针视为 uint32_t
:它们“只是”您可以分配的值,就像常规整数一样。只是它们的值被解释为地址,而不是一个随机整数(即它的值对计算机有特殊意义,因为它与内存紧密相关)。
1:如@WhozCraig 所述,strdup()
不是 标准库的一部分,因此您必须#include
适用于您的平台的 header (尽管它确实广泛传播并且几乎不是问题)。
关于c - 为什么我会收到以下代码的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56603011/