排序区分大小写的数组在C中不起作用

时间:2019-12-14 15:56:57

标签: c string sorting

我正在尝试通过strcmp使用不区分大小写的具有相同单词的数组按字母顺序对单词words[number of words][number of letters]的区分大小写的数组进行排序。当我使用不区分大小写的数组对不区分大小写的数组进行排序并打印时,它可以工作,但是如果我尝试使用不区分大小写的数组对不区分大小写的数组进行排序,则不会。以下是我用来执行此操作的代码块。


char cs_sns[20][20];
///scan here as you wish/////
char cs_ins[20][20];

for(int i = 0; i < 20; i++)
{
    strcpy(cs_ins[i], cs_sns[i]);
}

//////////////////CONVERT///////////////////////////
for(int i = 0; i < 20; i++)
{
    strlwr(cs_ins[i]);
}

 /////////////////SORT_CASE_SENSITIVE_BY_LOWERCASE/////////////////////


    for (int j = 0; j < 20; j++)
    {
        for (int i = 0; i < 20-1; i++)
        {
            int x = (strcmp(cs_ins[i], cs_ins[i+1]) > 0); 
            if (x == 1)
            {
                char temp[20];
                strcpy(temp, cs_sns[i]);
                strcpy(cs_sns[i], cs_sns[i+1]);
                strcpy(cs_sns[i+1], temp);
            }
        }
    }

/////////////////////SORT_LOWERCASE_BY_LOWERCASE/////////////////
    for (int j = 0; j < 20; j++)
    {
        for (int i = 0; i < 20 - 1; i++)
        {
            int x = (strcmp(cs_ins[i], cs_ins[i+1]) > 0); 
            if (x == 1)
            {
                char temp[20];
                strcpy(temp, cs_ins[i]);
                strcpy(cs_ins[i], cs_ins[i+1]);
                strcpy(cs_ins[i+1], temp);
            }
        }
    }

    ///////////////PRINT/////////////////

    for (int i = 0; i < 20; i++)
    {
        printf("%s\n", cs_sns[i]);       //////////swap with cs_ins[i] and see what happens
    }

下面是被盗的函数strlwr,将其转换为小写。

///////////define strlwr/////////////////////

char *strlwr(char *str)
{
    unsigned char *p = (unsigned char *)str;

    while (*p) 
    {
        *p = tolower((unsigned char)*p);
        p++;
    }

    return str;
}

您需要为tolower包括ctype.h。

我想念的是什么? 谢谢。

编辑:可以通过stricmp解决,这是一个链接: C99 remove stricmp() and strnicmp()?

还是好奇的...

1 个答案:

答案 0 :(得分:2)

之所以会出现此问题,是因为您试图根据不区分大小写的数组对区分大小写的数组进行排序,而不会更改不区分大小写的数组。

这可能有效:

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1

因此也将更改应用于不敏感的数组。

当然,如莫妮卡所说,仅使用 /////////////////SORT_CASE_SENSITIVE_BY_LOWERCASE///////////////////// for (int j = 0; j < 20; j++) { for (int i = 0; i < 20-1; i++) { int x = (strcmp(cs_ins[i], cs_ins[i+1]) > 0); if (x == 1) { char temp[20]; strcpy(temp, cs_sns[i]); strcpy(cs_sns[i], cs_sns[i+1]); strcpy(cs_sns[i+1], temp); //swap elements in cs_ins[] as well strcpy(temp, cs_ins[i]); strcpy(cs_ins[i], cs_ins[i+1]); strcpy(cs_ins[i+1], temp); } } } 将是一个简单得多的解决方案。