【发布时间】:2020-08-01 13:39:45
【问题描述】:
所以我尝试制作字符数组并玩弄它。
#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(三个字符串连在一起,没有空格)
当我将初始化器更改为长度为 12(与字符串长度相同)时,同样的问题仍然存在
另外,当我尝试printf("%s\n", str2) 时,它也有类似的问题——它在一行中打印第二个和第三个字符串,中间没有任何内容
但当我将其更改为 13 或更大时,它只会按预期打印 str1。
这不是紧急情况,我知道我必须将字符串声明的长度超过它的长度(在这种情况下超过 13),但我只是想知道为什么 printf 会做这样时髦的事情。
谢谢~
【问题讨论】:
-
您不能使用
%s打印字符数组。%s格式说明符仅用于字符串。 -
@DavidSchwartz Errr... 抱歉,我是 C 语言的新手,但
char str_name[size];几乎所有教程都显示了如何定义字符串...所以你能告诉我什么是正确的吗?那怎么办? (我一直以为char数组和字符串是一回事) -
想想
strlen的工作原理。 -
如果你使用
char example[4] = "abcd";,C允许初始化(省略空字节——C11 §6.7.19 Initialization ¶14,但另见[¶2]((port70.net/~nsz/c/c11/n1570.html#6.7.9p2));结果是一个字节数组,而不是字符串。§7.1.1 Definitions of terms ¶1:字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。最好不要让编译器计数;使用char str1[] = "Yo! Angelo!~";— 它不会计数时不要出错。
标签: c arrays string printf initializer