在没有指针算术的情况下将格式化字符串附加到C(而不是C ++)中的字符串?

时间:2010-01-07 21:53:39

标签: c pointers

写了一个非常简单的C函数来说明我想要简化的内容:

void main(int argc, char *argv[]){
    char *me="Foo";
    char *you="Bar";
    char us[100];
    memset(us,100,0x00);

    sprintf(us,"You: %s\n",you);
    sprintf(us+strlen(us),"Me: %s\n",me);
    sprintf(us+strlen(us),"We are %s and %s!\n",me,you);
    printf(us);
}

似乎应该有一个标准的库函数来处理我正在用sprintf做的事情并推进指针,不是吗?已经因为我已经完成了任何数量的C ...

谢谢, -AJ

5 个答案:

答案 0 :(得分:10)

sprintf返回写入的非NUL字符数。

int len = 0;
len += sprintf(us+len, ...);
len += sprintf(us+len, ...);
...

答案 1 :(得分:2)

嗯...你不能只使用类似的东西:

sprintf(us, "You: %s\nMe: %s\nWe are %s and %s!\n, you, me, me, you);

答案 2 :(得分:1)

您可能正在寻找strcat(甚至更好strncat)。

答案 3 :(得分:1)

char *me="Foo";
char *you="Bar";
char us[100];

char* out = us;
out += sprintf(out,"You: %s\n",you);
out += sprintf(out,"Me: %s\n",me);
out += sprintf(out,"We are %s and %s!\n",me,you);
printf("%s", us);

答案 4 :(得分:1)

永远不要使用非常量字符串作为printf的第一个参数(或fprintf的第二个参数。这是不好的做法。尝试将me变量更改为{{1}并告别你的堆栈并向"Muahaha %n%d%n%d%n%d%n%d%n"问好。SEGFAULT将尝试格式化字符串,但你没有提供任何参数来处理它,即使有格式说明符字符串printf不知道你没有给它任何参数。

如果要输出“预格式化”字符串,请使用printf。很少有案例将fputs(str,stdout)与非常量格式字符串一起使用。