sprintf vs strcat附加字符串

时间:2019-06-27 19:17:19

标签: c

我有以下一行:

  sprintf(someString,"%s%s",someString,someOtherString);

编译器给我以下警告:

//someFile.c:277:15: error: passing argument 1 to restrict-qualified parameter aliases with argument 3 [-Werror=restrict]

我想用不会给我编译错误的东西替换该行。我用错误搜索了一下,并了解了受限指针,这是我的解决方案:

strcat(someString, someOtherString);

这是否提供相同的功能?在我的测试中确实如此,但是我不想在某些情况下破坏代码的功能。

2 个答案:

答案 0 :(得分:4)

您应将strcat与足够大的目标数组一起使用。

sprintf与目标相同的数组和%s的字符串参数一起使用具有未定义的行为。大多数现有的实现都将针对问题中的特定情况产生预期的结果,但是C标准使其明确未定义。

编译器正确地抱怨警告可能很难破译:

passing argument 1 to restrict-qualified parameter aliases with argument 3

这意味着参数3与参数1指向的数组重叠,如果对参数3指向的数组进行了取消引用,这是不正确的,因为它将别名化通过声明为restrict的参数1取消引用的内存。 sprintf原型中的指针,表示没有其他指针可以读写通过它访问的内存。

如果sprintf(someString, "%.0s%s", someString, someOtherString);符合someOtherString,则someString这样的极端情况将定义行为,因为未取消引用参数3,但编译器仍会发出警告。

答案 1 :(得分:3)

使用sprintf打印到与源之一相同的字符串中是未定义的行为。您可以sprintf打印到第三个字符串,但是无论如何strcat都会表现得更好,因为它不必解析格式字符串并进行额外的复制。在这两种情况下,您都需要确保someString中有足够的空间来容纳someOtherString的内容。