-1

我正在尝试做与字符串、数组和指针相关的实验表。问题是“对存储在指针数组中的 5 个字符串单词进行排序”。

我尝试了很多,并在各个站点中搜索了该问题的解决方案。我已经能够按字母顺序对字符串进行排序,但始终是字符串末尾的另一个字符串的一部分。

就像如果我输入了像笔记本电脑comp这样的字符串,那么输出将是comptop笔记本电脑

主要代码是:

main()
{
char *str[10], *t;
int i,j;

for(i=0;i<5;i++)
{
    scanf("%s",&str[i]);
}

for(i=0; i<5; i++)
{
    for(j=i+1; j<5; j++)
    {
        if (strcmp(&str[j-1], &str[j]) > 0)
        {
            t=str[j];
            str[j]=str[j-1];
            str[j-1]=t;
        }
    }
}
printf("\n");

for(i=0;i<5;i++)

{
    printf("%s\n",&str[i]);
}
}
4

1 回答 1

1

以下行是未定义错误的原因。

scanf("%s", &str[i]);

问题:

  1. 类型str[i]char*。类型&str[i]char**。编译器应该警告您使用给定格式的类型是错误的,%s.

  2. 将字符串读入该地址会损坏您的堆栈并导致未定义的行为。

从语法上讲,您可以使用

scanf("%s", str[i]);

但这将是一个问题,除非您为字符串分配内存。

您可以在堆或堆栈上为字符串分配内存。暂时让我们假设您不打算在字符串中保存超过 99 个字符。

要使用堆栈中的内存:

char str[10][100], *t;
int i,j;

for(i=0;i<5;i++)
{
    scanf("%99s", str[i]);
}

要使用堆中的内存:

char* str[10], *t;
int i,j;

for(i=0;i<5;i++)
{
    str[i] = malloc(100);
    if ( str[i] != NULL )
    {
       scanf("%99s", str[i]);
    }
}

确保free()在使用堆中的内存时调用。

线

    if (strcmp(&str[j-1], &str[j]) > 0)

不正确,因为&str[j-1]and的类型&str[j]char**。再一次,您应该已经收到来自编译器的警告。该行需要是:

    if (strcmp(str[j-1], str[j]) > 0)

块:

    {
        t=str[j];
        str[j]=str[j-1];
        str[j-1]=t;
    }

仅当您使用堆中的内存时才有效。如果您使用堆栈中的内存,则需要使用strcpy()str.

线

printf("%s\n",&str[i]);

应该

printf("%s\n", str[i]);

这个时候,你应该知道为什么了。

于 2015-03-20T03:17:00.520 回答