为什么我的阵列打印出来是重复的?

时间:2018-01-06 05:49:23

标签: c arrays

我想将C中的数组复制到另一个数组,然后将它们打印出来。当我打印出第二个数组时,它打印出两次。造成重复的原因是什么?

当我调试(Xcode)时,一切看起来都很正常,直到for循环的最后一次迭代,然后突然,test2数组等于“testtest”。

#include <stdio.h>

int main()
{
  char test1[4];
  char test2[4];

  test1[0] = 't';
  test1[1] = 'e';
  test1[2] = 's';
  test1[3] = 't';

  /* Copy the stuff from test1 into test2 */
  for(int j = 0; j<4; j++){
    test2[j] = test1[j];
  }

  printf("test1: %s\n", test1);
  printf("test2: %s\n", test2);
  printf("end testing");

  return 0;
}

我的结果是:

test1:test

test2:testtest

结束测试

3 个答案:

答案 0 :(得分:1)

您的代码有未定义的行为。 char数组不会以空值终止。

两次输出因为它没有得到\0然后输出相邻变量值test1test2

%s期望一个空终止的char数组或字符串。你没有提供它。似乎char数组test1test2在内存中相邻。因为它不知道在哪里停止,因为它没有得到任何\0 - 它打印了两个数组内容。然后它以某种方式得到\0并且它停止了。但如果内存旁边没有任何\0,它将继续打印。您无法或应该回复此行为。

你可以这样做,但你最好还是使用nul终止的char数组。 (让生活更轻松。)

printf("%.*s",4,test1);
printf("%.*s",4,test2);

您可以像这样初始化字符串

char test1[]="test";

然后你可以使用strcpy来复制字符串 - 尽管确保你有适当大小的目的地(同时考虑到nul终止字符)。

不要使用gets() - 而是使用fgets()或类似功能。

答案 1 :(得分:1)

C字符串以空值终止。如果你没有在字符串的末尾放置一个空字符(&#39; \ 0&#39;),它实际上将无法正常工作(因为错误)。这样做:

  char test1[5];           //****
  char test2[5];

  test1[0] = 't';
  test1[1] = 'e';
  test1[2] = 's';
  test1[3] = 't';
  test1[4] = '\0';         //****

  /* Copy the stuff from test1 into test2 */
  for(int j = 0; j<4; j++){
    test2[j] = test1[j];
  }
  test2[j] = '\0';         //****

但是你不需要放一个&#39; \ 0&#39;当您从用户那里获取整个字符串输入时,例如:scanf("%s", s)gets(s),因为它会自动放入。

答案 2 :(得分:0)

尝试使用字符串复制功能

$("#id_form_location").submit(function(event) {
  alert('it works');
});