【问题标题】:Bubble Sort with Strings, but it's not sorting well使用字符串进行冒泡排序,但排序不好
【发布时间】:2020-04-06 10:12:17
【问题描述】:

我正在尝试按升序对字符串数组进行排序

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

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

【问题讨论】:

  • 旁白:请使用tolower() 以在ctype.h 中找到。您甚至不需要先测试范围。 data[i][j] = tolower(data[i][j]);
  • 你有字符串溢出。在第一次测试中,char temp[10]; 可以持有"Ultimate",但现在太短了,无法持有"UMN Medical Centre"。我建议char temp[50]; 匹配二维数组的字符串。
  • 您可能想检查您的库是否支持strcmpi - 不区分大小写等同于strcmp。 - 这比将整个字符串转换为大写或小写更有效。
  • @WeatherVane 感谢您的回答!对此,我真的非常感激。你的意思是范围是数组中的字符数吗?
  • “范围”是指字符值。您可以安全地将'2' 传递给tolower,它会返回相同的值——而不是一些奇怪的小写尝试。

标签: c bubble-sort


【解决方案1】:

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

阅读这个链接How dangerous is it to access an array out of bounds?也不错看看这里how strcmp() works

【讨论】:

  • 感谢hanie 再次出现,非常感谢。我也会仔细阅读您的链接推荐。 :)
  • @ChristianHalim 欢迎您,因为我是学生,我一直在这里找到问题的帮助,请随意这是 SO 的目的。
【解决方案2】:

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

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

【讨论】:

  • 感谢您再次出现帮助我,很抱歉回复晚了。我真的很感谢你总是为我的代码推荐有用的函数,干杯:))
猜你喜欢
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 2014-12-06
  • 2021-08-13
  • 2019-05-10
  • 2017-09-27
  • 1970-01-01
  • 2012-05-12
相关资源
最近更新 更多