C 正在将未知错误字符添加到字符串中?

C 正在将未知错误字符添加到字符串中?,c,C,我正在学习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; } 我希望答案是test is xx和xx问

我正在学习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;
}                            

我希望答案是
test is xx和xx

问题是像
“xx”
这样的字符串文本有一个额外的字符作为nul终止,
\0
,也就是说,它由字符
'x'
'x'
'0'
组成

这就是函数如何获取
char*
并将其视为字符串来了解字符串的范围。您的数组只是太短了一个元素,缺少nul终止符。通过将不指向nul终止字符串的
char*
传递给需要nul终止字符串的函数,您正在调用未定义的行为

您可以这样初始化它们:

char test[] = "xx";
这将导致
test
具有正确的
3
长度。您可以使用
sizeof
操作符来测试这一点。当然,您也可以明确表示长度:

char test[3] = "xx";

但这更容易出错。

问题是字符串文本,如
“xx”
有一个额外的字符作为nul终止,
\0
,也就是说,它由字符
'x'
'x'
'\0'
组成

这就是函数如何获取
char*
并将其视为字符串来了解字符串的范围。您的数组只是太短了一个元素,缺少nul终止符。通过将不指向nul终止字符串的
char*
传递给需要nul终止字符串的函数,您正在调用未定义的行为

您可以这样初始化它们:

char test[] = "xx";
这将导致
test
具有正确的
3
长度。您可以使用
sizeof
操作符来测试这一点。当然,您也可以明确表示长度:

char test[3] = "xx";

但这更容易出错。

当您在C中定义这样的字符串时

char A[] = "hello";
A = { 'h', 'e', 'l', 'l', 'o', '\0'}
它被初始化为类似这样的东西

char A[] = "hello";
A = { 'h', 'e', 'l', 'l', 'o', '\0'}
最后一个空字符是字符串所必需的。所以在你的代码中

char test1[2]="xx";
您已将
test1
字符数组设置为2个字符长,没有为空字符留下任何空间

要更正程序,您可以不提供字符数组的大小,如

char test1[]="xx";
或者,再输入一个你要填写的字符,如

char test1[3]="xx";

在C中定义字符串时,如下所示

char A[] = "hello";
A = { 'h', 'e', 'l', 'l', 'o', '\0'}
它被初始化为类似这样的东西

char A[] = "hello";
A = { 'h', 'e', 'l', 'l', 'o', '\0'}
最后一个空字符是字符串所必需的。所以在你的代码中

char test1[2]="xx";
您已将
test1
字符数组设置为2个字符长,没有为空字符留下任何空间

要更正程序,您可以不提供字符数组的大小,如

char test1[]="xx";
或者,再输入一个你要填写的字符,如

char test1[3]="xx";

在您的代码
char test1[2]=“xx”
中,
char test1[2]
为两个字符创建了一种“容器”,但实际字符串
“xx”
隐式包含三个字符
xx0
,其中
0
表示行的结束。这0是printf的一个指示符,它应该停止读取输入字符串。在您的例子中,printf没有得到这个0,因为0不适合
test1
,它在内存中读取到一些随机的零,并在途中打印它遇到的所有内容

您应将您的声明更改为以下内容:

char test1[3]="xx"

在您的代码
char test1[2]=“xx”
中,
char test1[2]
为两个字符创建了一种“容器”,但实际字符串
“xx”
隐式包含三个字符
xx0
,其中
0
表示行的结束。这0是printf的一个指示符,它应该停止读取输入字符串。在您的例子中,printf没有得到这个0,因为0不适合
test1
,它在内存中读取到一些随机的零,并在途中打印它遇到的所有内容

您应将您的声明更改为以下内容:

char test1[3]="xx"

谢谢,这真的很管用。我不应该声明字符数吗?@donniezazen是的,你可以(参见我上次的编辑)。但你必须把它做好@donniezazen它很管用,但是RHS真的有4个角色,所以你少了一个:-)谢谢你的表演。我不应该声明字符数吗?@donniezazen是的,你可以(参见我上次的编辑)。但你必须把它做好@donniezazen它是有效的,但是RHS实际上有4个字符,所以你只缺一个:-)