【问题标题】:How to print char array in C, like 'Arrays.ToString(array)' of Java?如何在 C 中打印 char 数组,如 Java 的 'Arrays.ToString(array)'?
【发布时间】:2019-04-03 14:05:42
【问题描述】:

我想像 Java 的 Arrays.ToString(array); 一样在 C 中打印 char 数组。它打印我想要的内容,但在最后放置了一些字符。我猜是因为\0这个特殊字符。

我声明了一个字符数组char letters[] = {'g','y','u','c','n','e'};

并尝试打印:printf("\n [%s]:", letters);

输出为:[gyucneÇ_=]

这是Java代码:

    char[] letters= {'g','y','u','c','n','e'};
    System.out.print( Arrays.toString(letters) );

输出是:

[g, y, u, c, n, e]

我想要输出 Java 代码。我想知道我是否也希望它包含逗号,我必须一个一个打印字符还是可以一次打印?

当然,我的首要任务是删除打印在 C 代码末尾的特殊字符。

【问题讨论】:

  • 为什么不将数组声明为char letters[] = "gyucne";
  • C 字符串以空值结尾,这意味着它们包含一个值为 0 的字节来标记字符串数据的结尾。不包含此类终止符的 char 数组不是字符串,并且尝试像使用它一样使用它会产生未定义的行为。您提供的结果证明了 UB 的无数可能表现之一。
  • 有什么区别?
  • char letters1[] = {'a', 'b', 'c'};char letters2[] = "abc"; 的区别在于,字母1 有3 个元素,字母2 有4 个元素,第4 个元素是letters2[3] == '\0'
  • 问题被回答(回滚)后不要更改! 别忘了'\0' 字符串终止符。

标签: c arrays char


【解决方案1】:

单独打印每个字母。您没有字符串。您不能从 <string.h>printf() 或一堆其他需要 字符串 的函数调用大多数函数。

char letters[] = {'g', 'y', 'u', 'c', 'n', 'e'}; // ATTENTION: letters is not a string!
for (int i = 0; i < sizeof letters; i++) {
    putchar(letters[i]);
}
putchar('\n'); // end with a newline

【讨论】:

  • 种类:它会打印一个带有0 值的字节,它可能会显示一些花哨的字符。使用char letters[] = "gyucne";,您就有了正确的字符串。使用printf("%s\n", letters); 打印会更容易
【解决方案2】:

我声明了一个 char 数组:char letters[] = {'g','y','u','c','n','e'};

但这 not 是一个 C 字符串(因为它是 not NUL 终止的!)。您应该改为编码:

const char letters[] = {'g','y','u','c','n','e',(char)0};

(或使用'\0' 而不是(char)0 ....)或更好:

const char letters[] = "gyucne";

两者完全等价。

然后您可以编写类似 printf("letters are %s\n", letters); 的代码,因为您的 letters 现在是 C 字符串。

注意。另请阅读http://utf8everywhere.org/How to debug small programs - 两者实际上都与您的情况非常相关。另请参阅至少一些C reference 站点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多