使用指针数组在c中进行字符串排序

时间:2015-03-20 02:58:56

标签: c string sorting arrayofstring

我正在尝试与字符串,数组和指针相关的实验表。问题是"对存储在指针数组中的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]);
}
}

1 个答案:

答案 0 :(得分:1)

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

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

问题:

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

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

  3. 从语法上讲,你可以使用

    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]&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]);
    

    到这个时候,你应该知道原因。