C 正在将未知错误字符添加到字符串中?
我正在学习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问
#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个字符,所以你只缺一个:-)