繁体   English   中英

sprintf vs strcat附加字符串

[英]sprintf vs strcat for appending string

我有以下几行:

  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);

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

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

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

编译器正确地发出警告,警告可能很难破译:

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

这意味着参数3与参数1指向的数组重叠,如果参数3指向的数组被取消引用,这是不正确的,因为它会别名通过参数1取消引用的内存,该参数在sprintf原型中被声明为restrict指针,这意味着任何其他指针都不应读取或写入通过它访问的内存。

角落情况,例如sprintf(someString, "%.0s%s", someString, someOtherString); 如果someOtherString符合someStringsomeString定义行为,因为未取消引用参数3,但编译器仍可能发出警告。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM