【问题标题】:Strange characters in String C字符串 C 中的奇怪字符
【发布时间】:2021-12-13 21:18:09
【问题描述】:

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

所以我写了一个函数,它根据数字返回一个带有一些空格的字符数组。

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

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

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 可以解决问题,但我没有。

【问题讨论】:

  • 请记住,C 中的字符串实际上称为 null-terminated 字符串。由于您的字符串中没有空终止符,所有寻找终止符的字符串函数都会超出范围,这会导致 未定义的行为
  • 打电话malloc(0)时也要小心。如果返回 NULL 或有效指针(不能被取消引用!),则定义它的实现。
  • 当然,每次循环迭代都会发生内存泄漏,因为您从未调用过free

标签: c memory char c-strings memset


【解决方案1】:

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

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

不包含字符串。

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

你可以改写

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

另一种方法只是将调用pf printf更改为以下方式

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

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

【讨论】:

  • 谢谢!!问题在于终止符不存在。
  • @DocPython 完全没有。不客气。:)
  • @h0r53 谢谢。我已经更新了错字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 2020-06-25
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
相关资源
最近更新 更多