【问题标题】:Error: char converts between pointers to integer types with different sign错误:char 在指向具有不同符号的整数类型的指针之间转换
【发布时间】:2018-02-17 10:52:04
【问题描述】:

问题:编写一个程序 anagram,对单词中的字母进行排序,这在搜索 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;

}

【问题讨论】:

  • argv[1]char*anagram 接受unsigned char*
  • 我应该把unsigned char*放在哪里
  • 当您处理 nul-terminated 字符串时,为什么要将unsigned char * 放在任何开头?只需使用void anagram (char *input)

标签: c arrays pointers


【解决方案1】:

对您的问题的简短回答是您收到指针符号不匹配警告,因为您试图将 argv[1](类型 char *)传递给您已使用 unsigned char * 参数声明的 anagram(尽管你用input[],实际效果是input作为参数使用时衰减为指针)

在为anagram 保留unsigned char* 类型的同时,简单的解决方案是在将argv[1] 作为参数传递给anagram 时将(unsigned char *) 转换为(unsigned char *),例如

    anagram((unsigned char *)argv[1]);

更实际的问题是“你真的需要unsigned char* 类型开头吗?”虽然您可以转义并将非 ASCII 值作为参数传递给您的程序 - 这是您期望并希望通过使用 unsigned char* 来防止的事情(这是 100% 可以做到的)。

通常,您只需声明anagram (char *input)(这是消除指针上的有符号不匹配的第二种选择)并将循环限制为在ASCII字符的有效范围内循环(请参阅ASCIItable.com

只要您始终如一地处理指针签名,任何一种方式都可以。将其放在一起并从代码中删除 magic numbers,您可以执行类似以下操作:

#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来将多个排序的字符串混合在一起,否则它是最好在每个字符串的输出后留下)

检查一下,如果您还有其他问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2023-03-05
    • 2015-01-06
    相关资源
    最近更新 更多