- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在开发自己的 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/
我目前正在开发自己的 scanf 函数实现,但我无法使用除 va_ 宏之外的任何库函数。 除了打印 *fmt 变量中的内容并且不是 %d、%s 等之外,一切都几乎有效。 例如 myPrintf("%d
我需要制作一个 my_printf 函数,它接受一个字符串,只将字符串的第一个字母大写(即使之前有空格),然后做一个\n,全部在 110 个字符以内(不包括空格/制表符)。 我只能修改注释“TO BE
我是一名优秀的程序员,十分优秀!