【问题标题】:C char appears as int when compilingC char 在编译时显示为 int
【发布时间】:2013-01-15 14:32:39
【问题描述】:

我正在学习 C,并且一直在尝试制作一个接受用户输入的程序,并删除其中的所有双空格,然后再次打印出来。我们还没有完成数组,所以我需要一个字符一个字符地做这个。这是我的代码:

#include <stdio.h>

main()
{
    char c;
    int count;
    count = 0;

    while ((c = getchar()) != '\n')
        if (c == ' ')
            count++;
        if (c != ' ')
            count = 0;
        if (count <= 0)
            printf("%s", c);
}

但是,此代码不起作用。编译器返回错误

:15: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’

有什么帮助吗?我不知道我做错了什么。

【问题讨论】:

    标签: c char int printf compiler-warnings


    【解决方案1】:

    使用%c 格式说明符打印单个char

    printf("%c", c);
    

    %s 格式说明符告诉printf 期待一个以空字符结尾的字符数组(又名字符串)。

    错误消息是指c 的类型为int,因为默认提升了传递给printf 的参数(超出格式字符串)。 This previous answer 对默认促销有很好的描述; this previous thread 解释了为什么需要默认提升的一些原因。

    【讨论】:

    • 你能解释一下为什么错误信息是指int吗?
    • @Martinv.Löwis 好点。我添加了指向以前线程的链接,其中包含比我管理的更好的解释
    • 请注意,getchar() 返回的是 int,而不是 char。这样你就可以区分 charEOF 的读取(显然不能是合法的 char 值)。不是最亮的界面,但很紧凑(现在已经习惯了)。
    【解决方案2】:

    您正在使用%s,它用于字符串并且需要终止 NULL 字符 (\0)..

    使用%c 将逐个打印您的字符..

    【讨论】:

      【解决方案3】:

      你的代码有很多问题

      • 首先,您%s打印一个字符(它需要一个字符指针,即一个字符串)

        在 C 中,char 字面量的类型为 int,因此无论是否提升,它们始终是 int。在 C++ 中,char 文字的类型为char,但在像其他答案所说的那样进行提升之后,它们又将是 int。一个普通的 char 变量也将在表达式中提升为 int,并在像 printf 这样的 vararg 函数中作为 int 传递。这就是编译器警告您 argument 2 has type ‘int’ 的原因,因为它期待 char* 而您传递给它的是 int

        → 必须使用%c 来打印字符

      • while 循环的主体只是第一个 if 块,因为在 C 块范围内是由 {} 定义的,而不是由缩进定义的。所以代码会这样运行,和你想的不一样

        while ((c = getchar()) != '\n')
        {
            if (c == ' ')
                count++;
        }
        if (c != ' ')
            count = 0;
        if (count <= 0)
            printf("%s", c);
        

        → 您需要将代码块放在一对括号中。并使用 else 而不是 2 个单独的 if 来使其更具可读性和更快(对于愚蠢的编译器)

        while ((c = getchar()) != '\n')
        {
            if (c == ' ')
                count++;
            else
                count = 0;
            if (count <= 0)
                printf("%s", c);
        }
        
      • main() 是错误的。 C 中的正确版本是

        int main(void)
        int main(int argc, char **argv)
        

        What should main() return in C and C++?

      • c 必须声明为int,因为getchar 返回int。见Why must the variable used to hold getchar's return value be declared as int?

      一个小问题是,不是int count; count = 0;,而是在声明int count = 0 时初始化变量。或者更好的是使用unsigned int,因为计数不能为负数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-01
        • 2012-06-01
        • 1970-01-01
        • 2020-02-29
        • 1970-01-01
        相关资源
        最近更新 更多