首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中连接使用sprintf格式的字符串

如何在C中连接使用sprintf格式的字符串
EN

Stack Overflow用户
提问于 2021-07-27 14:40:06
回答 2查看 1.2K关注 0票数 1

我有多个句子,目前正在控制台打印。我得把它们串成一根绳子。

守则的一部分是:

代码语言:javascript
复制
#include <stdio.h>
#include<string.h>

int main()
{
    char buffer [100];
    sprintf (buffer, "%d plus %d is %d", 5, 3, 5+3);
    char *c=buffer;
    sprintf (buffer, "and %d minus %d is %d", 6, 3, 6-3);
    strcat(c, buffer);
    printf ("[%s]",c);
    return 0;
    return 0;
}

我试图使用sprintf创建格式化字符串,但结果是错误的。句子的长度和数量是无限的。

我希望上面代码的输出如下所示:

5加3等于8,6减3等于3

但它是:

6减3等于3,6减3等于3

我要怎么把它们连接起来?而且,句子的长度和数量是无限的。我在使用malloc和realloc方面有困难。有人能帮忙吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-27 14:48:54

sprintf (buffer, "and %d minus %d is %d", 6, 3, 6-3);重写buffer而不是级联。丢失了前一个sprintf()的原始结果。

strcat(c, buffer);buffer附加到自身。由于重叠,它是未定义的行为(UB)。别那么做。

相反,使用sprintf() (打印字符数)的返回值来确定胶印。

代码语言:javascript
复制
int offset = sprintf (buffer, "%d plus %d is %d", 5, 3, 5+3);
offset += sprintf (buffer + offset, " and %d minus %d is %d", 6, 3, 6-3);
offset += sprintf (buffer + offset, " even more");
printf ("[%s]",buffer);

避免使用strcat(),因为这需要代码迭代前一个字符串,从而导致Schlemiel Painter算法。最好跟踪字符串的长度,并将其用于下一个sprintf()

更好的代码可以使用snprintf()来防止缓冲区溢出。

代码语言:javascript
复制
// Pedantic example
char buffer [100];
size_t offset = 0;
size_t available = sizeof buffer;

int retval = snprintf (buffer, available, "%d plus %d is %d", 5, 3, 5+3);
if (retval < 0 || (unsigned) retval >= available) Handle_Overflow();
offset += retval;
available -= retval;

retval = snprintf (buffer + offset, available, " and %d minus %d is %d", 6, 3, 6-3);
if (retval < 0 || (unsigned) retval >= available) Handle_Overflow();
offset += retval;
available -= retval;

retval = snprintf (buffer + offset, available, " even more");
if (retval < 0 || (unsigned) retval >= available) Handle_Overflow();
offset += retval;
available -= retval;

printf ("[%s]",buffer);

句子的长度和数量是无限的。

通常,一个大缓冲区就足够了,因为无限不是真正的无限,只是可能很大。C字符串仅限于SIZE_MAX

选择:研究非C标准asprintf()

票数 5
EN

Stack Overflow用户

发布于 2021-07-27 14:55:06

好的程序需要很好的design.Simplify。

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main()
{
    fprintf(stdout, "%d plus %d is %d", 5, 3, 5+3);
    fprintf (stdout, "and %d minus %d is %d", 6, 3, 6-3);
    return 0;
}

为了处理无限问题,可以将其输出到文件或其他文件中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68546954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档