是否有更好的方法在c中连接多个字符串,而不是连续多次调用strcat(),如下所示?
char prefix[100] = "";
strcat(prefix, argv[0]);
strcat(prefix, ": ");
strcat(prefix, cmd_argv[0]);
strcat(prefix, ": ");
strcat(prefix, cmd_argv[1]);
perror(prefix);
Run Code Online (Sandbox Code Playgroud)
Jac*_*cob 21
sprintf(prefix,"%s: %s: %s",argv[0],cmd_argv[0],cmd_argv[1]);
Run Code Online (Sandbox Code Playgroud)
或者snprintf防止缓冲区溢出.
Wes*_*ker 11
snprintf将是最好和最容易使用的选项,虽然它可能不是"快".你没有说明你的标准是什么.不过,简单就是这样:
snprintf(prefix, sizeof(prefix), "%s: %s: %s", argv[0], cmd_argv[0], cmd_argv[1]);
Run Code Online (Sandbox Code Playgroud)
为此,我可能会打个代表,但那太麻烦了。可能发生的最糟糕的事情是我会学到一些东西。
这些天我实际上并不使用C,而且我通常不在C ++中使用C样式的字符串。但是我有一个想法是编写一个修改后的strcpy(),该字符串返回字符串的结尾:
char* my_strcpy(char*dest, const char* src)
{
while ((*dest = *src++))
++dest;
return dest;
}
Run Code Online (Sandbox Code Playgroud)
现在,施莱姆尼尔可以随身带着水桶了:
char prefix[100] = "";
char* bucket = my_strcpy(prefix, argv[0]);
bucket = my_strcpy(bucket, ": ");
bucket = my_strcpy(bucket, cmd_argv[0]);
bucket = my_strcpy(bucket, ": ");
bucket = my_strcpy(bucket, cmd_argv[1]);
perror(prefix);
Run Code Online (Sandbox Code Playgroud)
我还没有测试。评论?
编辑:删除了不必要的my_strcat()功能。事实证明它也与相同stpcpy(),后者在2008年显然是POSIX的一部分。请参见http://www.manpagez.com/man/3/stpcpy/。
我会sprintf()像其他人建议的那样使用,但这是为了完整性:
如果您有stpcpy(),则可以执行以下操作:
char prefix[100] = "";
stpcpy(stpcpy(stpcpy(sptcpy(stpcpy(prefix, argv[0]), ": "),
cmd_argv[0]), ": "), cmd_argv[1]);
perror(prefix);
Run Code Online (Sandbox Code Playgroud)
如上所述,stpcpy()这样做的方便之处在于它可以被“链接”。同样,由于stpcpy()返回指向结果字符串末尾的指针,因此后续stpcpy()调用不需要一次又一次地遍历旧数据。因此,它比多个strcat()s更有效,并且可能比更有效率sprintf()。 stpcpy()是POSIX:2008。