在 C 中打印 char 变量不能正确显示
Posted
技术标签:
【中文标题】在 C 中打印 char 变量不能正确显示【英文标题】:Printing a char variable in C doesnt show properly 【发布时间】:2022-01-20 12:30:00 【问题描述】:所以我的代码是:
#include <stdio.h>
int main()
char ch[5] = "funny";
printf("gum: ");
printf("ze numbre is %c \n", ch);
据我所知,它应该打印:
gum: ze numbre is funny
但不是输出ch
变量,而是输出一些奇怪的符号(它看起来像一个带有方形FF 的小红方块,有时上面写着F5),有什么提示吗?我正在用 VSCode 编码
【问题讨论】:
%s
,而不是 %c
。但是[5]
不足以容纳"funny"
,因为您需要为空终止符留出空间。
ch
是指向char
的指针
更高的警告级别可能有助于检测到这一点。我得到,warning: format '%c' expects argument of type 'int', but argument 2 has type 'char *' [-Wformat=]
在这段代码上。
char ch[5] = "funny";
to char ch[] = "funny";
获取编译器计算数组长度
好的,我搞定了,谢谢 Fred 和 Ed,保持滴水不漏,祝你玩得开心
【参考方案1】:
首先我编译了你的代码:
gcc c.c -Wall
c.c: In function ‘main’:
c.c:7:27: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=]
7 | printf("ze numbre is %c \n", ch);
| ~^ ~~
| | |
| int char *
| %s
然后将 c 更改为 s(正如编译器和 Fred Larson 所说):
#include<stdio.h>
int main()
char ch[5] = "funny";
printf("gum: ");
printf("ze numbre is %s \n", ch);
然后重新编译(没有错误)并运行
gcc c.c -Wall
./a.out
gum: ze numbre is funny
按预期工作......但它仍然没有像 Ed Heal 和 Fred Larson 所说的那样没有错误:它可以给出未定义的行为。所以接下来试试:让“编译器来计算数组的长度”
#include<stdio.h>
int main()
char ch[] = "funny";
printf("gum: ");
printf("ze numbre is %s \n", ch);
您可以在 explicit way中进行操作
char ch[6] = 'f', 'u', 'n', 'n', 'y', '\0';
或手动调整数组的长度(包括一个空符号的位置,which is is added automatically at the end of each string in C。
char ch[6] = "funny";
还有another way
#include<stdio.h>
int main()
char ch[5] = "funny";
printf("gum: ");
printf("ze numbre is %.5s \n", ch);
好吃吗?
【讨论】:
除非你很幸运,因为ch
仍然不是空终止的。当我做同样的改变时,我在行尾得到了垃圾:gum: ze numbre is funny�# �# �c
请参阅我上面的评论以更正代码
@Fred Larson 这种差异的原因是什么?海湾合作委员会?
@Adam:只是未定义的行为未定义。可能是不同的编译器、编译器选项或其他因素。【参考方案2】:
问题在于printf
转换说明符%c
期望将单个字符作为int
传递,例如'c'
。您正在传递ch
,这是一个char
的数组,当作为函数参数传递时,它会自动转换为指向其第一个元素的指针。你应该使用%s
作为这个参数。
还要注意char ch[5] = "funny";
不会创建正确的C 字符串,因为ch
中没有足够的空间来容纳funny
中的5 个字符和空终止符。让编译器计算数组的长度更安全
char ch[] = "funny";
您还可以定义一个char
指针并将其初始化为指向字符串文字:
char *ch = "funny";
这是修改后的版本:
#include <stdio.h>
int main()
char ch[] = "array";
const char *p = "pointer";
printf("gum: ");
printf("ch is an %s\n", ch);
printf("p is a %s\n", p);
return 0;
【讨论】:
以上是关于在 C 中打印 char 变量不能正确显示的主要内容,如果未能解决你的问题,请参考以下文章