C 语言中关于字符串的困惑

标签 c string

在 C 语言中,Char 数组一直让我感到困惑。

下面是代码:

char tcp_port[100], udp_port[6];
tcp_port[99] = '\0'; udp_port[5] = '\0';
fscanf(fp, " tcp_port=%s", tcp_port);
fscanf(fp, " udp_port=%s", udp_port);
printf("%s\n", tcp_port); printf("%s\n", udp_port);

这可以工作并打印出正确的数字。但是,由于 tcp_port 有 100 个元素,那么这些元素如何在打印时消失呢?该端口只有 5 个字符长,最后一个元素以 null 结尾。 printf 是否只是忽略那些未初始化的元素,并且这些未初始化的元素是否包含随机数据?

最佳答案

是的,printf() 仅打印第一个 \0 字符之前的字符。所有 C 字符串函数都执行此操作。它们还会在必要时自动附加 \0 字符,就像其中的 scanf() 函数一样。这就是为什么它被称为“0 终止字符串”。

其他元素可以包含任何内容,并且它们将被完全忽略。实际上,它们通常包含随机垃圾,但这取决于多种因素。

请注意,分配内存时必须牢记 \0 字符。您的 tcp_port 字符串最多只能包含 99 个字符,因为最后一个必须为 0。

关于C 语言中关于字符串的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29176377/

相关文章:

代码注释现在会生成编译器错误

c - C 中包含递增的逻辑表达式的求值

python - 为什么 Python3 str(bytes) 转换为文字字符串 b'<str>'

c - 如何修剪格式为 char[] 的字符串?

c - Windows 上的 malloc

c - 如何打印单个字符的可变长度字符串

string - 如何在 Haskell 中制作开始/结束索引列表?

java - 相对于窗口大小将绘制的字符串居中?

java - ClassCastException : java. lang.String 无法转换为 Ljava.lang.String

c - 如何从 Serial.read() 中检索字符串值;