我正在学习C.有些角色会自动添加到我的程序中。我做错了什么?
#include <stdio.h>
#include <string.h>
int main() {
char test1[2]="xx";
char test2[2]="xx";
printf("test is %s and %s.\n", test1, test2);
return 0;
}
以下是我在Fedora 20上运行它的方法。
gcc -o problem problem.c
./problem
test is xx?}� and xx@.
我希望答案是test is xx and xx
。
答案 0 :(得分:2)
问题是,"xx"
之类的字符串文字有一个额外的字符,即nul-termination,\0
,也就是说,它由字符'x'
,{{组成} 1}}和'x'
。
这就是采用'\0'
并将它们视为字符串的函数知道字符串范围的方式。你的数组只是一个元素太短,缺少nul-terminator。通过将不指向以空字符结尾的字符串的char*
传递给期望的字符串,您将调用未定义的行为。
你可以这样初始化它们:
char*
这将导致char test[] = "xx";
具有正确的test
长度。您可以使用3
运算符对其进行测试。当然,您也可以明确说明长度:
sizeof
但这更容易出错。
答案 1 :(得分:2)
在C中定义像这样的字符串
char A[] = "hello";
它被初始化为像这样的
A = { 'h', 'e', 'l', 'l', 'o', '\0'}
它需要最后一个空字符才能成为字符串。所以在你的代码中
char test1[2]="xx";
您已将test1
个字符数组设为2个字符,不留空字符。
要更正您的程序,您可以不指定字符数组的大小,例如
char test1[]="xx";
或者,再提供一个您正在填写的字符,例如
char test1[3]="xx";
答案 2 :(得分:1)
在您的代码char test1[2]="xx"
中,char test1[2]
为两个字符创建一个“容器”,但实际的字符串"xx"
隐含有三个字符xx0
,其中0
1}}表示该行的结尾。这个0是printf的指示符,它应该停止读取输入字符串。在你的情况下,printf不会得到0,因为0不适合test1
,并且它在内存中读取一些随机零,打印它在途中遇到的所有内容。
您应该将声明更改为以下内容:
char test1[3]="xx"