【问题标题】:Strange outputs char in C (This is not typo) [closed]C中的奇怪输出char(这不是错字)[关闭]
【发布时间】:2021-07-29 19:51:23
【问题描述】:

请解释发生了什么。我无法理解输出。

#include <stdio.h>
int main()
{
    char c="c";
    printf("%c",c);
    return 0;
}

还有c="false""e"、'false' 等时的输出是什么

我想了解发生了什么。我知道 char 的用法是:'a'。

PS 该代码运行良好,在我的编程入门本科课程考试中被问到。

【问题讨论】:

  • 字符常量用单引号写。您应该从编译器收到有关此代码的警告。
  • 你会得到编译错误,因为c没有被声明。
  • @MikeCAT 那是我的错。已编辑
  • "c" --> 'c' 双引号用于字符串。字符的单引号。
  • C 没有字符串类。 C 没有的字符串类不是char

标签: c char output printf string-literals


【解决方案1】:

要将单个字符值分配给char 对象,请使用单引号:

char c = 'c';

双引号表示一个字符串,它是一个包含零值终止符的字符序列——字符串"c"实际上是序列{'c', 0},它的类型是“2-element array的char”,在这种情况下“衰减”以键入“指向char”的指针。

方便的助记符 - 单个字符使用单引号。

编辑

实际上,回过头来看,我过于简单化到了错误的地步。

'c' 是一个字符常量的例子,它可以是一个更多个由单引号分隔的字符。 C 中字符常量的类型是int,而不是char

一些字符常量使用转义序列来表示不可打印的字符,例如

'\n' - newline
'\t' - tab
'\b' - backspace

您还可以使用八进制或十六进制数字的转义序列:

'\033` - ESC using octal digits
'\x1b' - ESC using hex digits

一些实现允许多字节字符常量,例如'ABCD' - 这些常量的值和含义是实现定义的。

【讨论】:

  • 谢谢,真的很有帮助
  • @ShashwatGupta:请看我的编辑。
  • "方便的助记符 - 单个字符使用单引号。"我不同意。 char s[1] = "c" 是单字符并使用双引号。它应该是单字符,其中只存储一个字符使用单引号,字符串使用双引号。
【解决方案2】:

在做

char c = "c"

错了,"c" 是一个包含一个元素和一个空终止符的数组,第一个元素是 99,也称为'c'。例如。

char ab[2] = "ab"

这里"ab"等价于{'a', 'b', '\0'}末尾的'\0'解释如下。 "c" 等价于{'c', '\0'} 并且数组通常指向数组的第一个元素。因此,在您的代码中c 实际上指向一个数组,其第一个元素是c。所以指向该数组的指针也指向'c'。

char c = *"c"

确实有效,但很糟糕。如果c 是指针,您还可以将printf 更改为printf("%c\n", *c),引用c 将为您提供数组的第一个元素,而c 是第一个和元素。

你应该这样做

char c = 'c'

而字符串的空终止是因为:

"c" 或任何其他字符串实际上是{'c', '\0'},末尾有一个空终止符。需要这样我们才能知道字符串何时结束。例如。

"abcdefgh" 中,我们不知道字符串何时结束,用户必须知道每个字符串的长度加上缓冲区的长度,所以它在结尾处由'\0' 终止,并且当达到'\0' 时,将停止解析字符串。 所以,"abcdefgh" 实际上是{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', '\0'}

【讨论】:

  • "c" 是一个包含两个元素的数组,并不等同于{'c'}
  • @EugeneSh。我刚刚意识到我忘了说我没有计算空终止,当你评论这个时我正在编辑我的答案。我只是对人们评论的速度感到惊讶。
  • 一旦确定,我会很乐意回复我的投票。
  • 你不能用printf("%c\n", *c)char c 做。
  • @EugeneSh。我还有什么遗漏吗,我真的认为我已经犯了多少错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 2013-01-10
  • 2020-10-04
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多