1

我正在使用 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;

}

这是错误: 在此处输入图像描述

4

7 回答 7

3

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

printf("%s", z);
于 2013-11-02T12:48:01.557 回答
2

%c表示int参数转换为unsigned char,并将生成的字符写入。对于其他类型int(包括提升为的类型int),行为是 undefined

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

printf(" %s", z);
于 2013-11-02T12:49:07.623 回答
1

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

尝试

printf(" %c", *z);

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

如果要打印所有字符,请将其视为字符串(指向带有终止 NUL 字符 '\0' 的字符数组的指针。NUL 字符是自动添加的,因为您的字符串用双引号引起来。

尝试

printf(" %s", z);
于 2013-11-02T12:48:13.940 回答
1

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

于 2013-11-02T12:52:24.620 回答
0

调用函数时,“char”作为“int”传递。但是你传递了一个指向'char'的指针,这根本不是一回事。错误消息抱怨它看到了一个指针。在您的情况下,由于您要打印字符串而不是单个“字符”,因此您的格式错误;请改用 %s。

于 2013-11-02T12:49:09.607 回答
0

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

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

等等等等。

于 2013-11-02T14:49:37.167 回答
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 数组的特定索引处打印特定字符,则可以尝试使用以下代码:

#包括

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;
}
于 2013-11-02T15:57:11.530 回答