gpt4 book ai didi

C、带有多个变量的 printf 段错误

转载 作者:行者123 更新时间:2023-11-30 19:06:28 27 4
gpt4 key购买 nike

尝试通过 printf 输出大量变量时出现错误。

unsigned int vmID = 11;
char vm_title[512] = "title-123qwe";
unsigned int vm_cpu = 2;
unsigned int vm_ram = 12;
char vm_serveces[2048] = "123456789qweertrty";
char vm_notes[2048] = "wertyuio2345678";
unsigned int vm_vc = 3;
unsigned int vm_dc = 12;
unsigned int vm_cl = 6;
unsigned int vm_pl = 32;
unsigned int vm_os = 0;

printf("name='%s', cpu='%d', ram='%d', services='%s', notes='%s', vcname='%d', dcname='%d', clname='%d', poolname='%d', os='%d' id='%d';", vm_title, vm_cpu, vm_ram, vm_serveces, vm_notes, vm_vc, vm_dc, vm_cl, vm_pl, vm_os, vmID);

但是单独或小组工作是正确的:

printf("name='%s,", vm_title);
printf("cpu='%d',", vm_cpu);
printf("ram='%d',", vm_ram);
printf("services='%s',", vm_serveces);
printf("notes='%s',", vm_notes);
printf("vc='%d',", vm_vc);
printf("dc='%d',", vm_dc);
printf("cl='%d',", vm_cl);
printf("pl='%d',", vm_pl);
printf("os='%d';", vm_os);

我等待:“name='title-123qwe',cpu='2',ram='12',services='123456789qweertrty',notes='wertyuio2345678',vcname='3',dcname='12' , clname='6', poolname='32', os='0' id='11', name='title-123qwe';"

附注对于我的任务,我使用诸如(也不起作用)的构造:

int len = snprintf(NULL,0, "xxx", yyy);
char *somevar = malloc(len + 1);
sprintf(somevar, "xxx", yyy);

怎么了?是否可以使用单个调用,或者必须在几次点击中粘合变量?

嗯。我创建一个新文件:

#include <stdlib.h>
#include <string.h>

int main () {
unsigned int vmID = 11;
char vm_title[512] = "title-123qwe";
unsigned int vm_cpu = 2;
unsigned int vm_ram = 12;
char vm_serveces[2048] = "123456789qweertrty";
char vm_notes[2048] = "wertyuio2345678";
unsigned int vm_vc = 3;
unsigned int vm_dc = 12;
unsigned int vm_cl = 6;
unsigned int vm_pl = 32;
unsigned int vm_os = 0;

// vc_ram = vm_pl + vm_vc;

printf("name='%s', cpu='%d', ram='%d', services='%s', notes='%s', vcname='%d', dcname='%d', clname='%d', poolname='%d', os='%d' id='%d';", vm_title, vm_cpu, vm_ram, vm_serveces, vm_notes, vm_vc, vm_dc, vm_cl, vm_pl, vm_os, vmID);

printf("name='%s,", vm_title);
printf("cpu='%d',", vm_cpu);
printf("ram='%d',", vm_ram);
printf("services='%s',", vm_serveces);
printf("notes='%s',", vm_notes);
printf("vc='%d',", vm_vc);
printf("dc='%d',", vm_dc);
printf("cl='%d',", vm_cl);
printf("pl='%d',", vm_pl);
printf("os='%d';", vm_os);

return 0;
}

一切正常。

但是如果我取消注释字符串 vc_ram = vm_pl + vm_vc; = segfault

任何对变量的操作都失败了。

最佳答案

当然可以将许多变量链接在一起进行打印,您只需确保格式字符串与给定的参数匹配,以免进入未定义的行为领域。

您的简化代码中的内容应该可以正常工作,这让我相信您可能将其简化太多。我建议发布导致问题的实际代码(一个完整的、能够编译的程序,表现出错误的行为),因为您给我们的代码绝对没有任何问题。数据设置正确,printf 调用正确。

我见过 printf 的实现(例如在嵌入式系统中)具有诸如 4K 最大缓冲区大小之类的限制,但您还远远没有达到这一点。

<小时/>

但是,看看您的(原始的,现已更改的)代码:

int len = snprintf(NULL,0, "xxx", yyy);
char *somevar = malloc(len + 1);
sprintf(NULL,0, "xxx", yyy);

如果这确实你正在做的事情,我对你崩溃并不感到惊讶 - 你实际上并没有填充你正在做的内存分配,意味着它将被设置为某个任意值,包括可能的非空终止“字符串”。

无论如何,sprintsnprintf 不同,它并不真正喜欢传入 NULL 缓冲区。

第三行应采用以下形式:

sprintf(somevar, "xxx", yyy);
<小时/>

而且,最重要的是,尽管在小程序中不太可能,malloc 可以失败并返回 NULL - 你应该始终在依赖 C 函数的值之前检查是否失败。

关于C、带有多个变量的 printf 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48004506/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com