0

不知道怎么回事,每次在下面的代码中输入第二个字符串,都会弹出一个错误框。我正在使用 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;
            }
        }
    }
}
4

4 回答 4

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);
}

编辑:

除了此更改之外,您还需要合并ie 条件变为建议simonc的更改以及更改为的循环构造。除了上述之外,通过这 2 项修改,您的代码将可以正常工作。strcmpif(strcmp(name[j], name[j+1]) > 0)for ( j = 0 ; j <i; j ++ )malloc

于 2013-04-09T14:16:24.067 回答
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 <=
于 2013-04-09T14:17:25.787 回答
0

fgets(名称[x],100,标准输入);

您正在将其复制到未分配的内存中。

字符 *name[5] ;

它只会创建一个大小为 5 的字符指针数组。您必须初始化该指针的值。

于 2013-04-09T14:24:09.570 回答
0

你没有name[]正确分配。大多数现代语言都会为您分配字符串和东西,但是 C 是老派,您需要自己管理它。有几种方法可以做到这一点。

char name[5][100];

这会在堆栈上分配一个 500 字节长的本地二维数组。 name[0]指分配开始时的 100 字符数组。 name[1][3]指第二个 100 字符缓冲区中的第四个字符,即name. name[4]是最后一个 100 字符数组。

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],即使它是一个分配数组而不是二维数组。

于 2013-04-09T14:28:46.847 回答