我有多个句子,目前正在控制台打印。我得把它们串成一根绳子。
守则的一部分是:
#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方面有困难。有人能帮忙吗?
发布于 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() (打印字符数)的返回值来确定胶印。
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()来防止缓冲区溢出。
// 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()。
发布于 2021-07-27 14:55:06
好的程序需要很好的design.Simplify。
#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;
}为了处理无限问题,可以将其输出到文件或其他文件中。
https://stackoverflow.com/questions/68546954
复制相似问题