[英]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
符合someString
, someString
定义行为,因为未取消引用参数3,但编译器仍可能发出警告。
使用sprintf
打印为与源之一相同的字符串是未定义的行为。 您可以使用sprintf
来打印到第三个字符串,但是无论如何strcat
都将具有更高的性能,因为它不必解析格式字符串并进行额外的复制。 在这两种情况下,您都需要确保someString
中有足够的空间来容纳someOtherString
内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.