【问题标题】:Printing a char variable in C doesnt show properly在 C 中打印 char 变量不能正确显示
【发布时间】: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,保持滴水不漏,祝你玩得开心

标签: c string compiler-errors printf undefined-behavior


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多