我不知道发生了什么,每次我在下面的代码中输入第二个字符串时,都会弹出一个错误框。我使用Codeblocks作为编译器。是因为我使用指针指针?
#include<stdio.h>
#include<conio.h>
void sort_string(char **) ;
void main()
{
char *name[5] ;
int x =0;
printf("Enter Names");
for(x = 0 ; x < 5 ; x++)
{ fflush(stdin);
fgets( name[x], 100, stdin);
}
sort_string(name);
for( x = 0 ; x < 5 ; x++)
{
puts(name[x]);
}
}
void sort_string(char *name[5])
{
char *temp;
int i , j ;
for ( i = 4 ; i >=0; i--)
{
for ( j = 0 ; j <=i; j ++ )
{
if(strcmp(name[j] > name[j+1]))
{
temp = name[j+1];
name[j+1] = name[j];
name[j] = temp;
}
}
}
}
答案 0 :(得分:0)
从您的代码char *name[5]
定义5
个字符数组的数组。因此,当您执行fgets( name[x], 100, stdin);
时,预计会为name[x]
分配内存,因为name[x]
是指针。因此,代码可以修改为
for(x = 0; x < 5; x++)
{
name[x] = malloc(sizeof(char) * 100);
fgets( name[x], 100, stdin);
}
修改强>
除了此更改之外,您还需要将simonc
建议的更改合并到strcmp
,即条件变为if(strcmp(name[j], name[j+1]) > 0)
,并将循环结构更改为for ( j = 0 ; j <i; j ++ )
。除了上面malloc
之外的这两个修改,您的代码将正常工作。
答案 1 :(得分:0)
正如对该问题的评论中所述,您需要为name
元素分配内存。一种简单的方法是注意您将名称的长度硬编码为99个字符(传递给fgets
的限制)并将数组更改为
char name[5][100];
一旦你这样做,你的字符串比较就不太对了。你能改变吗?
if (strcmp(name[j] > name[j+1]))
到
if (strcmp(name[j], name[j+1]) > 0)
这将显示另一个错误。你的内循环可以运行到j=4
。然后,当您访问name[j+1]
时,可以读取/写入数组末尾。这里最简单的解决方法是将内循环更改为更快退出一次迭代
for (j=0 ; j<i; j++)
// < rather than <=
答案 2 :(得分:0)
fgets(name [x],100,stdin);
您正在将其复制到未分配的内存中。
char * name [5];
它只会创建一个大小为5的字符指针数组。 您必须初始化该指针的值。
答案 3 :(得分:0)
您没有正确分配name[]
。大多数现代语言都会为你分配字符串和东西,但C是老派,你需要自己管理它。有几种方法可以做到这一点。
char name[5][100];
这在堆栈上分配一个500字节长的本地二维数组。 name[0]
在分配开始时引用100-char数组。 name[1][3]
指的是第二个100-char缓冲区中的第四个字符,它是name
中的第104个字节。 name[4]
是最后一个100-char数组。
char *name[5];
int i;
for(i = 0; i < 5; i++) {
name[i] = malloc(sizeof(char)*100);
}
此处,name
是一个包含5个char *
值的数组,大概长度为40个字节。这些指针中的每一个都指向堆上单独的100字节分配。您可以像上面name[5][100]
一样引用缓冲区和字符,即使它是一个分配数组而不是二维数组。