字符串 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 循环会产生大量内存泄漏,因为循环的每次迭代中分配的内存都没有释放。
我写一个简单的编译器只是为了好玩,我希望每一行都有适当的缩进。
所以我写了一个函数,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 循环会产生大量内存泄漏,因为循环的每次迭代中分配的内存都没有释放。