【问题标题】:Why does the array get overwritten? [duplicate]为什么数组会被覆盖? [复制]
【发布时间】:2019-01-28 23:34:36
【问题描述】:

我正试图找出我的代码中的一个错误,但由于某种原因,scanf() 循环之后数组似乎变得很奇怪。 这可能是什么原因?

我输入的输入是“a”、“b”、“c”。 这是控制台的输出:

all element are: a
all element are: b
all element are: c
s: c
after loop1: c
after loop3: c

s_arr 在循环完成后更改。

这是我的代码:

int main() {

    char s[5];
    char *s_arr[3];

    for(int i=0; i<3; i++){
        scanf("%s\n", s);
        s_arr[i] = s;
        printf("all element are: %s\n", s_arr[i]);
    }
    printf("s: %s\n", s);
    printf("after loop1: %s\n", s_arr[0]);
    printf("after loop3: %s\n", s_arr[2]);

    return 0;
}

【问题讨论】:

  • s_arr[i] = s 不会复制字符串。如果你printf("%p\n", s_arr[i])你会发现s_arr中的所有指针都指向同一个地址,也就是s的地址。
  • 你的程序中只有一个字符串char s[5]。你也有 3 个指向字符串的指针。但它们最终指向同一个字符串。
  • 这甚至编译没有警告
  • scanf("%s\n", s); 是非常糟糕的代码。格式字符串中的\n 会导致违反直觉的行为(使用户感到困惑),并且缺少返回值检查意味着您不知道scanf 是否真的设法读取了任何内容。另外,没有输入限制,所以那里存在缓冲区溢出错误。
  • 什么意思,循环后数组变奇怪了?循环内部和外部的变量没有区别。输出与此一致。

标签: c


【解决方案1】:

您没有覆盖数组元素。但是,每个元素都是一个指针,并且您正在使每个 s_arr[0]s_arr[1]s_arr[2] 都指向 s 中的字符串。

因为只有一个字符串,并且每个指针在循环之后都指向同一个字符串,所以当你打印出来时你会得到相同的结果。

解决此问题的一种方法是将s_arr 设为字符串数组(即二维char 数组),并将s 复制到每个字符串中。

另外,考虑fgets() 用于字符串输入,这样可以防止缓冲区溢出。

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 2018-03-29
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2020-03-06
    • 2021-10-29
    相关资源
    最近更新 更多