【问题标题】:Sorting case sensitive array not working in C排序区分大小写的数组在C中不起作用
【发布时间】:2019-12-14 15:56:57
【问题描述】:

我正在尝试通过 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()?

还是很好奇……

【问题讨论】:

  • 你知道stricmp函数吗?它进行不区分大小写的比较。
  • @Youssef13 stricmp() 不在标准 C 库中。
  • 您正在使用变量pos - 这是在哪里定义的以及它设置为什么?
  • 您不必在交换时复制整个字符串。只需交换数组中的指针即可。
  • 另外,您的第一个排序循环是比较 cs_ins 的元素,但交换 cs_sns 的元素。

标签: c string sorting


【解决方案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);
        }
    }
}

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

当然,正如 Monica 所说,只使用 stricmp 会是一个更简单的解决方案。

【讨论】:

  • 是的,就是这样。谢谢!
  • 在 POSIX 系统上,stricmp() 不一定可用(它不是 POSIX 标准的一部分),但在 &lt;strings.h&gt; 中找到的 strcasecmp() 是替代方案。当然,strlwr() 也不是 POSIX 函数。
猜你喜欢
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 2020-04-29
  • 2019-10-08
相关资源
最近更新 更多