问题:编写一个字谜程序,对单词中的字母进行排序,这在搜索字谜时很有用。anagram 接受一个参数,该参数是一个仅包含小写字母的字符串,按字母顺序对字母进行排序,然后打印排序后的字母。您可以使用任何您熟悉的排序算法,但您必须自己编写排序函数。您不得使用库提供的任何排序功能。
用法
$ ./anagram hello
ehllo
$ ./anagram positivity
iiiopsttvy
$ ./anagram abcdef
abcdef
Run Code Online (Sandbox Code Playgroud)
下面的代码是我到目前为止所做的,但我收到错误
将 char * 传递给 unsigned char 的参数会在指向具有不同符号的整数类型的指针之间进行转换
#include <stdio.h>
#include <string.h>
void anagram(unsigned char input[])
{
int count[256] = { 0 };
int i;
for (i = 0; input[i] != '\0'; i++)
{
count[input[i]]++;
}
for (i = 0; i < 256; i++)
{
while (count[i] > 0)
{
printf("%c", i);
count[i]--;
}
}
}
int main(int argc, char* argv[])
{
if(argc > 1)
{
anagram(argv[1]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对您问题的简短回答是您收到指针符号不匹配警告,因为您试图将argv[1](type char *) 传递给anagram您已使用参数声明的unsigned char *(虽然您使用input[],但实际效果是,input当用作一个参数)
保留unsigned char*类型的简单解决方案anagram是在作为参数传递给 时进行强制argv[1]转换,例如(unsigned char *)anagram
anagram((unsigned char *)argv[1]);
Run Code Online (Sandbox Code Playgroud)
更实际的问题是“您真的需要这种unsigned char*类型吗?” 虽然您可以转义非 ASCII 值并将其作为参数传递给程序,但这是您期望并希望通过使用来防止的事情unsigned char*(这是 100% 可以做到的)。
一般来说,您只需声明anagram (char *input)(这是消除指针上有符号不匹配的第二种选择)并将循环限制为在 ASCII 字符的有效范围内循环(请参阅ASCIItable.com)
只要您一致地处理指针符号,任何一种方法都可以。总而言之,并从代码中删除幻数,您可以执行类似于以下操作的操作:
#include <stdio.h>
#include <string.h>
#define CHRSET 256 /* if you need a constant, define one */
void anagram (unsigned char *input)
{
int i, count[CHRSET] = { 0 };
for (i = 0; input[i] != '\0'; i++)
count[input[i]]++;
for (i = 0; i < CHRSET; i++)
while (count[i] > 0) {
printf("%c", i);
count[i]--;
}
putchar ('\n'); /* provide a POSIX compliant newline before termination */
}
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf (stderr, "error: insufficient input\n"
"usage: %s <string>\n", argv[0]);
return 1;
}
anagram ((unsigned char *)argv[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(注意:您还可以将最终换行符的输出移至main,但除非您打算通过重复调用将多个已排序的字符串混合在一起anagram,否则最好将其保留在每个字符串的输出之后)
检查一下,如果您还有其他问题,请告诉我。