在c中连接多个字符串的更好方法?

use*_*804 23 c

是否有更好的方法在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防止缓冲区溢出.

  • 绝对将它改为`snprintf`.`sprintf`根本不应该用在现代代码中. (12认同)

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)


Fre*_*son 6

为此,我可能会打个代表,但那太麻烦了。可能发生的最糟糕的事情是我会学到一些东西。

这些天我实际上并不使用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/

  • “ my_strcpy()”在POSIX中被称为“ stpcpy()”,并且您不需要“ my_strcat()”,因为“ my_strcpy()”也可以正常工作(因为您已经有了指向末尾的指针)字符串)。 (4认同)

Alo*_*hal 5

我会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。