c - 为什么我的数组打印出副本?

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

我的结果是:

测试1:测试

测试2:测试测试

结束测试

最佳答案

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

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

%s 需要一个以 null 结尾的字符数组或字符串。你没有提供。而且似乎char 数组test1test2 在内存中是相邻的。因为它不知道在哪里停止,因为它没有得到任何 \0 - 它打印了两个数组内容。然后它以某种方式得到 \0 并停止了。但如果内存附近没有任何 \0,它将继续打印。您不能或应该对此行为进行回复。

顺便说一下,您可以这样做,但您最好再次使用以 nul 结尾的字符数组。 (让生活更轻松)。

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

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

char test1[]="test";

然后您可以使用 strcpy 来复制字符串 - 但要确保您的目的地具有适当的大小(还要考虑 nul 终止字符)。


不要使用 gets() - 而是使用 fgets() 或类似的函数。

关于c - 为什么我的数组打印出副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48124690/

相关文章:

c - 打开 FIFO 进行写入返回 "No such device or address"

c++ - float 组是否总是与 16 字节边界对齐?

ruby - 遍历数组(欧拉计划 #23)

php - 在 PHP 中使用数组存储多个值

javascript - 我如何从这个 Jsonarray 中删除 T 和 Z

java - 使直方图和星形图输出不正确

c - unix "clear"未设置 TERM 环境变量

在 C 中将大端转换为小端 [不使用提供的函数]

c - 将 char * 重新解释为用于只读操作的另一种原始类型的数组的任何合法方法?

Java 将 INT 数组中的项目添加到 String 数组