问题:编写一个程序anagram,用于对单词中的字母进行排序,这在搜索字谜时非常有用。 anagram采用单个参数,这是一个仅包含小写字母的字符串,按字母顺序对字母进行排序,然后打印排序后的字母。您可以使用您熟悉的任何排序算法,但您必须自己编写排序函数。您不能使用库提供的任何排序功能。
用法
$ ./anagram hello
ehllo
$ ./anagram positivity
iiiopsttvy
$ ./anagram abcdef
abcdef
以下代码是我到目前为止所做的,但我收到了错误
将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;
}
答案 0 :(得分:2)
您的问题的简短回答是您收到指针符号不匹配警告,因为您试图将argv[1]
(类型char *
)传递给您已使用参数声明的anagram
unsigned char *
{尽管你使用input[]
,实际效果是input
在用作参数时会衰减到指针。
保留unsigned char*
anagram
类型的简单解决方案是将argv[1]
转换为(unsigned char *)
作为参数传递给anagram
,例如
anagram((unsigned char *)argv[1]);
更实际的问题是&#34;你真的需要unsigned char*
类型开头吗?&#34;虽然您可以转义并将非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;
}
(注意:您也可以将最终换行符的输出移至main
,但除非您打算通过重复调用anagram
来将多个已排序的字符串混合在一起,然后最好在每个字符串的输出后留下)
仔细看看,如果您有其他问题,请告诉我。