C char在编译时显示为int

时间:2013-01-31 13:14:34

标签: c char int printf compiler-warnings

我正在学习C,并且一直在尝试创建一个接受用户输入的程序,并删除其中的任何双重空格,然后再将其打印出来。我们还没有完成数组,所以我需要通过char来做这个char。这是我的代码:

#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’

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

3 个答案:

答案 0 :(得分:8)

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

printf("%c", c);

%s格式说明符告诉printf期望以null结尾的char数组(也称为字符串)。

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

答案 1 :(得分:0)

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

使用%c将按char打印您的char ..

答案 2 :(得分:0)

您的代码存在很多问题

  • 首先,你打印一个带有%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个单独的ifs使其更具可读性和更快(对于哑编译器)

    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,因为count不能为负数