我正在学习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’
有任何帮助吗?我不知道我做错了什么。
答案 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)
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不能为负数