字符串 C 中的奇怪字符

Strange characters in String C

我写一个简单的编译器只是为了好玩,我希望每一行都有适当的缩进。

所以我写了一个函数,returns 一个字符数组,其中有一些空格,具体取决于数字。

问题是当生成数组时,一些字符在写入文件或打印时似乎是错误的。我认为它们是从包含一些信息的内存位置获取的,因为我看到了文件路径的片段。

我做了一个有同样问题的示例代码

int num = 0;
char *tabs;
for (; num < 20; num++)
{
    tabs = malloc(num);
    memset(tabs, '-', num);
    printf("%d | %sEND\n", num, tabs);
}

(我想这不是最好的代码,但我是 C 的初学者)

输出:

0 | Çc▬END
1 | -s▬END
2 | --▬END
3 | ---END
4 | ----END
5 | -----END
6 | ------END
7 | -------END
8 | --------P☺▬END
9 | ---------☺▬END
10 | ----------▬END
11 | -----------END
12 | ------------END
13 | -------------END
14 | --------------END
15 | ---------------END
16 | ----------------END
17 | -----------------END
18 | ------------------END
19 | -------------------END

我每次运行程序的字符都不一样

如果我使用 for 循环设置每个字符而不是 memset,结果将是相同的。

我读到 memset 可以解决问题,但我没有。

使用memset后动态分配的字符数组tabs

tabs = malloc(num);
memset(tabs, '-', num);

不包含字符串。

因此在调用 printf 时使用转换说明符 %s 调用此数组会调用未定义的行为。

你可以改写

tabs = malloc(num + 1);
memset(tabs, '-', num);
tabs[num] = '[=11=]';

另一种方法是按以下方式更改 pf printf 的调用

printf("%d | %.*sEND\n", num, num, tabs);

注意 for 循环会产生大量内存泄漏,因为循环的每次迭代中分配的内存都没有释放。