字符串中是否添加了未知的错误字符?

时间:2014-10-13 19:56:47

标签: 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;
}                            

以下是我在Fedora 20上运行它的方法。

gcc -o problem problem.c
./problem
test is xx?}� and xx@.

我希望答案是test is xx and xx

3 个答案:

答案 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"