奇怪的C语言排序

时间:2014-06-13 19:52:38

标签: c string sorting

我试图解决this question。问题说明

  

'Abecedarian'是一个单词,其字母按字母顺序排列。   编写一个程序,确定给定的单词是否为   是否是初学者,如果不是初学者则打印10如果没有。{/ p>

Input : user enter a string or word.
Output: print `1` if word is Abecedarian else `0`.

现在我解决了我将对字符串进行排序的问题,如果排序的字符串与原始字符串相同,那么它将是 Abecedarian 。但是在C代码中,它给出了输入的结果。代码如下,输入和输出

// is added by me in output for explanation

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

int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}

int main(void) {
    char orginalString[80];
    char copiedString[80];
    scanf("%s",orginalString);

    strcpy(copiedString,orginalString);
    printf("Original string before sorting = %s \n",orginalString);
    printf("Copied original string before sorting = %s \n",copiedString);

    qsort(orginalString,strlen(orginalString),sizeof(char),cmpfunc);

    printf("Original string after sorting = %s \n",orginalString);
    printf("Copied original string after sorting = %s \n",copiedString);

    if(strcmp(orginalString,copiedString) == 0) {
        printf("%s is an Abecedarian word\n",copiedString);
    }
    else 
        printf("%s is not an Abecedarian word\n",copiedString);

    return 0;
}

输入1

abcdef

输出1

Original string before sorting = abcdef 
Copied original string before sorting = abcdef 
Original string after sorting = fedabc // should remain abcdef, if obeying desc sort then should be fedcba
Copied original string after sorting = abcdef 
abcdef is not an Abecedarian word

输入2

fedcba

输出2

Original string before sorting = fedcba 
Copied original string before sorting = fedcba 
Original string after sorting = abcdef // here it is correct 
Copied original string after sorting = fedcba 
fedcba is not an Abecedarian word

您可以检查其他输入,并会看到排序无法正常工作。现在我在C中的内存管理方面不是很好。

是否有任何内存问题/调整会造成这种麻烦?

3 个答案:

答案 0 :(得分:2)

只需检查字符串中的字符是否为非降序,即可更有效地执行此操作:

int
is_abecedarian(char *s)
{
    if(s[0]==0) return 1;

    while(s[1] && s[0]<=s[1]) ++s;
    return s[1]==0;
}

请注意,我假设字符串s全部为大写或全部为小写。并且字符编码的a-z按数字顺序递增。

答案 1 :(得分:2)

要回答您的实际问题,此失败的原因是您将数据取消引用为int,而不是char。这意味着您将取消引用超出必要的字节数,并比较可能与“a”无关的字节。 ascii标准的'a'是0x61。如果将“a”取消引用为int,则可能最终得到0x61FFFFFF或0xFFFFFF61,具体取决于类型转换的实现方式。因此,你实际上并没有比较字符,而是字符和周围字节。

答案 2 :(得分:1)

您正在比较字符char,而非整数,int

将比较功能更改为

int cmpfunc (const void * a, const void * b)
{
   return ( *(char*)a - *(char*)b );
}