【问题标题】:Garbage characters in string字符串中的垃圾字符
【发布时间】:2015-01-28 23:57:17
【问题描述】:

我已经编写了代码来制作一个正确的金字塔。

但是,当我执行程序时,金字塔的最后两行即使超出了数组的大小,也会在它们之后放置垃圾字符。

代码在这里:

#include <stdio.h>
#include <string.h>

#define ROW 5
int main(void) {
  char array[ROW];
  int x = 0;
  int row = 0;

  for (row = 0; row < ROW; row++) {
    array[x] = 'a';
    if (x < ROW) {
      printf("%s\n", dolla);
    }
    x++;
  }
  getchar();
}

垃圾字符是从哪里来的?它只在第三行之后。

【问题讨论】:

  • 尝试在调试器中逐行执行程序。密切关注array[x] = 'a';
  • 你需要空终止它。
  • 什么是dolla?我没有看到它在任何地方定义。
  • char array[ROW+1] = {0}; 会帮到你很多。您可能会认为array 是空的,但它充满了随机字符。通过使用{0} 进行初始化,数组以所有 zeo 开始。
  • 是的,我也没有在任何地方看到dolla声明,无论如何,我建议你写for(row = 0; row &lt; ROW; row++, x++)而不是在for块内写x++

标签: c string loops character garbage


【解决方案1】:

您可能超出了数组中的值来创建金字塔,这会导致打印出甚至在您编译代码之前就存在的垃圾值。 当您打印值时,而不是打印出整个数组(这意味着可能包含垃圾值),您可以打印到具有有效值的点,这可以通过在数组的末尾。 在这里初始化你的数组也是一个更好的选择,因为你可以在看到输出后更好地调试你的代码。

【讨论】:

    【解决方案2】:

    char array[ROW+1] = {0}; 会帮到你很多。您可能假设数组是空的,但它充满了随机字符。通过使用{0} 进行初始化,数组以全零开始。

    我将假设 dolla 是一个转录错误,并且 dolla 应该是 array 或者 array 曾经被命名为 dolla

    【讨论】:

    • @tac @js1 可能值得注意的是,array 在问题代码中的大小为 5,循环将为 i 在 0 到 4 中写入 array[i] = 'a'。这意味着在在循环的最后一次迭代中,字符串的所有 5 个元素都将被填充,此时字符串不一定会以空值结尾(接下来的内存中抽签的运气)。 C 字符串(以 null 结尾的 char 数组)的大小应始终至少为 max_string_length + 1,以考虑必要的 null。
    • @Laogeodritt 在原始代码中,字符串在任何时候都不会以空值结尾,除非运气好。通过我的更改,我分配了 6 个字节的零,因此它将始终为空终止。我想我没有特别指出这一点。
    • 抱歉,我错过了您在建议的更改中将分配更改为 ROW+1。我只注意到初始化。
    【解决方案3】:

    您的代码中的问题是您没有用\0(空)字符终止您的字符串。这是您的代码的练习:

    #include <stdio.h>
    #include <string.h>
    #define ROW 5
    int main(void)
    {
    char array[ROW];
    int x = 0;
    int row = 0;
    
    
    for(row = 0; row < ROW; row++)
    {
    array[x] = 'a';
    
        if(x < ROW)
        {
            array[x+1]='\0';
            printf("%s\n", array);
        }
    x++;
    }
    
    getchar();
    }
    

    我不是专家,但我在许多典型的 C 书籍中阅读过以下内容: C 中的int 数组初始化为0,而char 数组初始化为垃圾。

    是的,忘了说,不是dolla,是array

    【讨论】:

    • "char 数组被初始化为垃圾。"添加一些细节以帮助理解原因,在 C 中初始化为“垃圾”的内存通常只是意味着进程保留了一块内存,但不向该内存块写入任何内容。无论以前存在什么,如果该段内存过去已经被同一个程序或另一个程序使用过,那么你得到的就是“垃圾”。
    最近更新 更多