我试图解决this question。问题说明
'Abecedarian'是一个单词,其字母按字母顺序排列。 编写一个程序,确定给定的单词是否为 是否是初学者,如果不是初学者则打印
1
,0
如果没有。{/ 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中的内存管理方面不是很好。
是否有任何内存问题/调整会造成这种麻烦?
答案 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 );
}