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