C 中带有较短初始值设定项的字符串的 printf 表现得很奇怪
printf in C with strings that has shorter initializer behaves weird
所以我尝试制作字符数组并尝试使用它。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char ** argv) {
char str1[11] = "Yo! Angelo!~"; //total length of 12, initializer is shorter
char str2[14] = "Yo! Angelo!233"; //total length of 14, initializer is same length
char str3[60] = "Yo! Angelo!wwww"; //initializer is longer
printf("%s"\n, str1);
}
编译器给我的警告是 initializer-string for array of chars is too long
我预计它只会给我 str1 的前 11 个字符,即 Yo! Angelo!
没有 '~'
但这是我将所有三个数组排成一行(第一个是前 11 个字符),因为这样
Yo! Angelo!Yo! Angelo!233Yo! Angelo!wwww
(三弦全部砸在一起没有space)
当我将初始化程序的长度更改为 12(与字符串长度相同)时,同样的问题仍然存在
另外,当我尝试 printf("%s\n", str2)
时,它有类似的问题——它在一行中打印第二个和第三个字符串,中间没有任何内容
但是当我将它更改为 13 或更大时,它只按预期打印 str1。
这不是紧急情况,我知道我必须声明的字符串长度超过它的长度(在这种情况下超过 13),但我只是想知道为什么 printf 会做这样的时髦事情。
谢谢~
当您使用对于数组来说太长的字符串初始值设定项时,您会丢失尾随字符,包括尾随 NUL 终止符。所以你最终得到不包含字符串(没有 NUL 终止符)的数组(str1 和 str2),所以当你尝试将它作为字符串打印时,你会得到未定义的行为。具体来说,它会打印内存中数组之后发生的任何事情,结果证明是其他数组。
所以我尝试制作字符数组并尝试使用它。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char ** argv) {
char str1[11] = "Yo! Angelo!~"; //total length of 12, initializer is shorter
char str2[14] = "Yo! Angelo!233"; //total length of 14, initializer is same length
char str3[60] = "Yo! Angelo!wwww"; //initializer is longer
printf("%s"\n, str1);
}
编译器给我的警告是 initializer-string for array of chars is too long
我预计它只会给我 str1 的前 11 个字符,即 Yo! Angelo!
没有 '~'
但这是我将所有三个数组排成一行(第一个是前 11 个字符),因为这样
Yo! Angelo!Yo! Angelo!233Yo! Angelo!wwww
(三弦全部砸在一起没有space)
当我将初始化程序的长度更改为 12(与字符串长度相同)时,同样的问题仍然存在
另外,当我尝试 printf("%s\n", str2)
时,它有类似的问题——它在一行中打印第二个和第三个字符串,中间没有任何内容
但是当我将它更改为 13 或更大时,它只按预期打印 str1。
这不是紧急情况,我知道我必须声明的字符串长度超过它的长度(在这种情况下超过 13),但我只是想知道为什么 printf 会做这样的时髦事情。
谢谢~
当您使用对于数组来说太长的字符串初始值设定项时,您会丢失尾随字符,包括尾随 NUL 终止符。所以你最终得到不包含字符串(没有 NUL 终止符)的数组(str1 和 str2),所以当你尝试将它作为字符串打印时,你会得到未定义的行为。具体来说,它会打印内存中数组之后发生的任何事情,结果证明是其他数组。