【问题标题】:Is this unsafe to use in C?这在 C 中使用不安全吗?
【发布时间】:2022-11-16 06:15:36
【问题描述】:

您好,我遇到了一个问题。我在 C 方面不是很有经验。

我正在尝试将一个字符连接到我的路径变量。

但是当我运行这行代码时,我的另一个字符串变量被“覆盖”或者之后表现得很奇怪。注释掉后一切正常。我不想在这里发布整个代码我只是想知道这一行是否运行起来不安全。

strcat(path, "/");

我也试过:

//edit i actually tried strcat but later strncat copied the line while reversing the changes//

char temp = '/';
strncat(path, &temp);

我一直坚持这一点,所以也许有人可以提供帮助。

【问题讨论】:

  • 那不能编译。 strncat 想要三个参数。阅读手册页linux.die.net/man/3/strncat。它甚至提到了为什么在错误使用后事情可能会表现得很奇怪/不可预测。
  • 是的,这是不安全的。您需要足够大的存储空间来容纳原始字符串加上更多的人物。在不显示“路径”是什么的情况下,我们必须假设它只有足够的空间容纳它包含的字符串。
  • 在大多数情况下,snprintfstrncat 好用得多。在这种情况下,您也可以使用 char *p = &path[strlen(path)]; *p++ = '/'; *p++ = '\0';,但前提是当前长度至少比最大长度小 2。
  • path 变量是如何定义的?
  • @printf 哦,谢谢你提出这个问题,我查看了声明,因为我正在重构一条很长的路径,所以初始大小太小了。一开始觉得够了,但是有点太少了

标签: c char c-strings strcat


【解决方案1】:

对于初学者,函数strncat 具有三个参数

char *strncat(char * restrict s1, const char * restrict s2, size_t n);

所以这个电话

strncat(path, "/");

不会编译。

除了这个错误,这个代码 sn-p

char temp = '/';
strncat(path, &temp);

还有一个错误是表达式&temp 没有指向字符串。

仅当包含字符串的数组有足够的空间容纳一个字符时,才可以将字符附加到字符串。例如,您可能不会更改字符串文字。

如果包含字符串的数组有足够的内存来容纳字符 '/' 那么你可以写

strcat( path, "/" );

或者

size_t n = strlen( path );
path[n++] = '/';
path[n] = '
猜你喜欢
  • 2021-01-10
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多