gpt4 book ai didi

c - 卡在 myPrintf 和 va_arg 列表中

转载 作者:行者123 更新时间:2023-11-30 15:26:54 25 4
gpt4 key购买 nike

我目前正在开发自己的 scanf 函数实现,但我无法使用除 va_ 宏之外的任何库函数。

除了打印 *fmt 变量中的内容并且不是 %d、%s 等之外,一切都几乎有效。

例如 myPrintf("%d stuff and more stuff %s",50,"foo");

将只打印 50foo 而不是 50 个东西以及更多的东西 foo

我尝试摆弄开关的默认部分,但它没有让我得到任何结果预先感谢您!

void myPrintf(char *fmt, ...)
{
va_list ap;
char *s;
char buf[64];
va_start(ap, fmt);

while(*fmt)
{
x++;
switch(*fmt++)
{
case 's':
s = va_arg(ap, char*);
write(1,s,strlen(s));
break;
case 'd':
s = toString(va_arg(ap, int));
write(1,s,strlen(s));
break;
case 'b':
s = toBin(va_arg(ap, int));
write(1,s,strlen(s));
break;
default:
break;
}
va_end(ap);
}

}

最佳答案

它打印 50foo,因为它仅在 fmt 中看到“d”或“s”或“b”时才打印。您应该检查“%”以打印您给出的参数,否则打印 fmt 中的字符。它应该类似于下面的代码:

void myPrintf(char *fmt, ...)
{
va_list ap;
char *s;
char c;
char s2[100];
char buf[64];
va_start(ap, fmt);

while(*fmt)
{
c = *fmt;
if (c == '%') {
fmt++;
switch(*fmt)
{
case 's':
s = va_arg(ap, char *);
write(1, s, strlen(s));
break;
case 'd':
memset(s2, 0, 100);
sprintf(s2,"%d",va_arg(ap, int));
write(1, s2, strlen(s2));
break;
default:
break;
}
} else {
write(1, fmt, 1);
}
va_end(ap);
fmt++;
}
write(1, 0, 1);
}

好吧,我稍微编辑了你的代码以使其在我的机器上工作,因为我没有 toString() 和 toBin() 的实现。但是,上面的实现会告诉你哪里出错了。该代码首先检查“%”符号,当它看到“%”时,它会检查“%s”和“%d”以打印参数“50”和“foo”。在所有其他情况下,它都会打印 fmt 中的字符,因此“stuff and more stuff”也会打印到 stdin。

关于c - 卡在 myPrintf 和 va_arg 列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27260647/

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