出于某种原因,我的第二个字符数组(var2)与第一个字符数组(var1)合并.这是我的代码:
#include#include #include int main() { char var1[5] = "Hello"; char var2[5] = "World"; printf("This program can write:\t%s\t%s\n", var1, var2); getch(); return 0; }
在编译之后,我得到了以下打印:
这个程序可以写:Hello WorldHello
当我更改代码时,printf("This program can write:\t%s\n", var2);
我得到以下打印:
这个程序可以写:WorldHello
所以很明显var1正在与var2合并.
这是某种编译错误吗?如果是这样,我该如何解决?我尝试重新安装MINGW,但我仍然得到相同的结果.
非常感谢
字符串实际上是由空字符'\ 0'终止的一维字符数组.因此,以null结尾的字符串包含组成字符串后跟null的字符.
以下声明和初始化创建一个由单词"Hello"组成的字符串.要将空字符保存在数组的末尾,包含该字符串的字符数组的大小比单词"Hello"中的字符数大1.
char var1[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
你可以更简单地做:
#include#include #include int main() { char var1[] = "Hello"; char var2[] = "World"; printf("This program can write:\t%s\t%s\n", var1, var2); getchar(); return 0; }
C编译器在初始化数组时自动将其'\0'
放在字符串的末尾(如果数组足够长以包含它'\0'
,否则'\0'
将丢弃而不是覆盖另一个变量).
你忘了包含\0
告诉字符串结尾的de ,所以更新你的数组大小加上一个就可以了:
#include#include #include int main() { char var1[6] = "Hello"; char var2[6] = "World"; printf("This program can write:\t%s\t%s\n", var1, var2); getchar(); return 0; }
这打印:
这个程序可以写:Hello World
当使用%s
格式说明符时printf
,它从内存中读取字符并在找到'\0'
字符时停止.如果它没有找到该'\0'
字符,则读取,直到它'\0'
在内存中找到某个字符.
在上面的代码中两者的var1
和var2
是长度的字符数组5
.由于您使用的%s
是格式说明符,因此需要使用它来终止它们'\0'
.这可以通过增加数组的大小来完成.这将'\0'
默认附加一个字符
char var1[6] = "Hello"; char var2[6] = "World";
见之间的差别char var1[5] = "Hello";
和char var1[6] = "Hello";
+--------+--------+--------+--------+--------+ | | | | | | | 'H' | 'e' | 'l' | 'l' | 'o' | char var1[5] = "Hello"; | | | | | | +--------+--------+--------+--------+--------+ +--------+--------+--------+--------+--------+--------+ | | | | | | | | 'H' | 'e' | 'l' | 'l' | 'o' | '\0' | char var1[6] = "Hello"; | | | | | | | +--------+--------+--------+--------+--------+--------+