printf()中的格式说明符在应该为char时请求int

时间:2013-11-02 12:45:34

标签: c printf format-specifiers format-string

我正在使用Pelles C ide而我正在学习C,我以为我知道%c是printf()中char的格式说明符,但它认为我正在尝试使用int?我该如何纠正这个问题。

以下是代码:

#include <stdio.h>

int main(void)
{
char z[] = "       *\n";
char m[] = "      *\n";
char k[] = "     *\n";
char o[] = "*   *\n";
char l[] = " * *\n";
char e[] = "  * ";



printf(" %c", z);
printf(" %c", m);
printf(" %c", k);
printf(" %c", o);
printf(" %c", l);
printf(" %c", e);



return 0;

}

以下是错误: enter image description here

7 个答案:

答案 0 :(得分:3)

您应该使用字符串说明符来输出字符串。

printf("%s", z);

答案 1 :(得分:2)

%c表示 int参数转换为unsigned char,结果字符为。对于int以外的其他类型(包括提升为int的类型),行为未定义

要打印字符串,请使用%s

printf(" %s", z);

答案 2 :(得分:1)

根据定义,您的变量 z 是一个指向char数组的指针。

尝试

printf(" %c", *z);

打印 z 指向的第一个字符。

如果要打印所有字符,请将其视为一个字符串(指向具有终止NUL字符'\ 0'的字符数组的指针.NUL字符由于您的字符串被包含在双精度中而自动添加引号。

尝试

printf(" %s", z);

答案 3 :(得分:1)

printf(" %c", z); z是一个字符串,不是字符串(字符串是字符数组),我认为您正在尝试执行此操作printf(" %c", '\n');或此{{1} }(printf(" %s", z);是输出字符串的正确格式说明符)

答案 4 :(得分:0)

调用函数时,'char'作为'int'传递。但是你将指针传递给'char',这根本不是一回事。错误消息抱怨它看到一个指针。在你的情况下,因为你想打印一个字符串而不是一个'char',你的格式是错误的;使用%s代替。

答案 5 :(得分:0)

实际上,如果你想要%c,请将变量定义为字符常量:

char c = ' ';
char d = '\n';

依此类推。

答案 6 :(得分:0)

创建数组时,数组变量的名称(如代码z,m,k,o,l,e)实际上保存数组的基址(即第0个索引的地址)你的阵列)因此,当您尝试打印z,m,k,o,l,e的值时,它们将返回相应数组的基址。您可以通过以下代码进行检查:

#include <stdio.h>

int main(void)
{
char z[] = "       *\n";
char m[] = "      *\n";
char k[] = "     *\n";
char o[] = "*   *\n";
char l[] = " * *\n";
char e[] = "  * ";



printf(" %d", z);
printf(" %d", m);
printf(" %d", k);
printf(" %d", o);
printf(" %d", l);
printf(" %d", e);



return 0;
}

上述代码不会显示任何错误,并会打印相应数组的基址。

为了更清楚,您可以尝试以下代码:

#include <stdio.h>

int main(void)
{
char z[] = "       *\n";
char m[] = "      *\n";
char k[] = "     *\n";
char o[] = "*   *\n";
char l[] = " * *\n";
char e[] = "  * ";



printf(" %c", &z);
printf(" %c", &m);
printf(" %c", &k);
printf(" %c", &o);
printf(" %c", &l);
printf(" %c", &e);



return 0;
}

上面的代码再次不会显示任何错误,并将打印相应数组的第一个字符。我希望它能让你明白为什么你的代码显示错误。

现在,当您使用%s和数组名称时,它将获取数组的基址,并将从该地址打印整个字符串,直到找到null,如下所示。 :

#include <stdio.h>

int main(void)
{
char z[] = "       *\n";
char m[] = "      *\n";
char k[] = "     *\n";
char o[] = "*   *\n";
char l[] = " * *\n";
char e[] = "  * ";



printf(" %s", z);
printf(" %s", m);
printf(" %s", k);
printf(" %s", o);
printf(" %s", l);
printf(" %s", e);



return 0;
}

并且,如果要在char数组的特定索引处打印特定字符,则可以尝试使用以下代码:

#include

int main(void)
{
char z[] = "       *\n";
char m[] = "      *\n";
char k[] = "     *\n";
char o[] = "*   *\n";
char l[] = " * *\n";
char e[] = "  * ";



printf(" %c", z[indexValue]);
printf(" %c", m[indexValue]);
printf(" %c", k[indexValue]);
printf(" %c", o[indexValue]);
printf(" %c", l[indexValue]);
printf(" %c", e[indexValue]);



return 0;
}