1

我正在尝试将字符串数组按升序排序

Abcdefg
Ultimate
UMN 
Bawaw

我希望结果应该是:

Abcdefg
Bawaw
Ultimate
UMN

我发现冒泡排序正在对字符串进行排序,例如:

Abcdefg
Bawaw
UMN
Ultimate

当我试图绕过它时,将所有内容都变成大写/小写字符串,但是如果我添加数据,它就会变得杂乱无章

#include<stdio.h>
#include<string.h>

int main(int argc, char **argv){

    char data[8][50] = {"Abcdefg","Ultimate","UMN", "Bawaw", "Ultima Sonora", "UMN Medical Centre", "Ultima Toys","BACD"};
    char temp[10];
    int i, j;

    printf("Original data = \n");
    for(i=0; i<8; i++){
        printf("%s\n", data[i]);
    }

    printf("\n");
    for(i = 0; i < 8; i++){
        for(j = 0; j < 50; j++){
            if(data[i][j] >= 65 && data[i][j] <= 90){
                data[i][j] += 32;
            }
        }
    }


    for(i = 0; i <8 ; i++){
        for(j = i+1; j < 8; j++)
        if(strcmp(data[i], data[j])>0){
            strcpy(temp, data[i]);
            strcpy(data[i],data[j]);
            strcpy(data[j], temp);
        }
    }
    printf("Sorted data = \n");
    for(i=0; i<8; i++){
        printf("%s\n", data[i]);
    }
    return 0;
}

有人知道那里发生了什么吗?

4

2 回答 2

3

首先注意temp没有足够的空间来容纳你的一些字符串,所以使用char temp[50]. 也因为 ASCII 代码l小于m您例外的结果,所以您的程序也是如此,但由于您有溢出,程序将有未定义的行为。这意味着任何事情都可能发生。

阅读此链接越界访问数组有多危险?在这里看看 strcmp()的工作原理也不错

于 2020-04-06T10:27:51.130 回答
1

我在您的代码中看到的另一件事是大写/小写字符串的一部分。

for(i = 0; i < 8; i++){
        for(j = 0; j < 50; j++){
            if(data[i][j] >= 65 && data[i][j] <= 90){
                data[i][j] += 32;
            }
        }
    }

你应该使用j < strlen(data[i]. 您也可以使用 tolower 函数作为上面的注释。

它成为了:

for(i = 0; i < 8; i++){
        for(j = 0; j < strlen(data[i]); j++){
            data[i][j] = tolower(data[i][j]);
        }
    }
于 2020-04-06T10:37:58.240 回答