在 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 变量不能正确显示的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中创建和显示链表:程序显示不正确

释放返回变量内存的正确方法

如果在 C 中使用 scanf 输入字符,如何获取打印错误

C# 为啥我的变量不能在表单之间正确传递?

为啥 const char* 返回值丢失了两个字符?但是在返回之前打印正确的值[重复]

这是正确使用new和delete - c ++ [重复]