如何修复“警告:多字符字符常量[-Wmultichar]”

时间:2015-06-26 03:32:45

标签: c

所以基本上该函数在文件中搜索'\ t'(制表符)字符,当它找到它时,它假设用'^ I'替换它

问题是c = '^I'会产生警告warning: multi-character character constant [-Wmultichar]。另一个问题只是我出现的不是^。

如果我将其更改为c = "^I",我会收到此警告“警告:分配从没有强制转换的指针生成整数”。这种方式也会放“\\”而不是^ I

我该如何解决这个问题?有没有更好的方法呢?

if ((fileContents = fopen("fileContents.txt", "r")) == 0) 
{
    perror("fopen");
    return 1; 
}

while ((c = fgetc(fileContents)) != EOF)
{

    if (c == '\t')
    {
        c = '^I';
    }
    putchar(c); 
}

3 个答案:

答案 0 :(得分:1)

您不能在字符文字中放置两个字符。 '^I'此处有两个字符 - ^I。 这是警告的原因:

  

多字符字符常量

不确定您要在此处实现什么,但在C中,您只能将单个ASCII charactercharacter escape sequence放在单引号中。 ^是系统特定的ANSI转义码我认为是终端颜色,由DOS和UNIX支持。您可以在字符串中使用它,只要您使用静态或动态分配声明它,或者只使用printf函数将其打印到标准输出流:printf("^I ^O test");

至于隐含声明。我假设c被声明为整数或其他类型的算术类型。您不能以任何方式为其指定字符串文字。您可以使用strcpy sprintf strncpy等函数执行此操作。在这种情况下,c必须已静态或动态分配。为了避免错误的隐式声明,请确保它的类型为char*,因此是一个字符区域,其中最后一个是空终止字符。如果要将字符串文字分配给char*,则将其存储在只读存储区中。

char *string;

string = "^I";

printf(string);

您可以使用pragma warning指令关闭警告。不要那样做。警告是有原因的。

答案 1 :(得分:1)

char只能是一个字符。 '^I'是两个。在你的情况下,你想要在角色上使用if / else,使用普通printf打印字符串

if (c == '\t') {
    printf("^I");
} else {
    putchar(c);
}

答案 2 :(得分:0)

很明显,

'^I'是两个角色。您不能将putchar与多个字符一起使用,并且正如gcc警告您的那样,多字符常量不是您想要使用的。

相反,请确保使用字符串。尝试类似:

const char *replacement = NULL;
if (c == '\t') replacement = "^I";

if (replacement) fputs(replacement, stdout);
else putchar(c);