【发布时间】:2016-10-20 23:37:53
【问题描述】:
我正在编写一个操作系统,但在创建 printf() 函数时遇到了问题。
当执行已确定存在 % 的 switch 语句并且现在正试图找出下一个字符是什么时,会发生这种情况:
print(string str) 会将字符串 str 打印到 stdout(但没有 %x、%d、%s 等)。
itoa(int n, string str, const uint8_t base) 会将 int 转换为指定基数的字符串。
case 'i':
case 'd': { // interger
const string str =
itoa(
va_arg(args, int),
str, 10);
print(str);
i++;
break;
}
case 'X':
case 'x': { // hexidecimal
const string str2 =
itoa(
va_arg(args, int),
str2, 16);
print("0x");
print(str2);
i++;
break;
}
%d 和 %i 完全按照它应该做的,但是如果输入小于 16 出于某种原因, %x 不能正常工作。但奇怪的是如果我注释掉处理 %d 和 %i 的部分,%x 会起作用。我不知道为什么会这样。我尝试过切换 d 和 x 的作用等等,但没有任何效果。我还尝试确保所有其他功能都正常工作。
如果有人想查看完整代码,这里是:
strLen(string str) 求字符串 str 的长度。
printch(char c) 打印一个字符 c 。
void printf (const string format, ... )
{
const size_t length = strLen(format);
va_list args;
va_start (args, format);
// print every character in string
for (size_t i=0; i < length; i++)
{
// percent signals special functionality
if (format[i] == '%')
{
switch (format[i+1])
{
case '%': // "%%" = %
printch('%');
break;
case 'i':
case 'd': { // interger
const string str =
itoa(
va_arg(args, int),
str, 10);
print(str);
i++;
break;
}
case 'x': { // hexidecimal
const string str2 =
itoa(
va_arg(args, int),
str2, 16);
print("0x");
print(str2);
i++;
break;
}
case 'c': // character
printch(
va_arg(args, char));
i++;
break;
case 's': // string
print(
va_arg(args, string));
i++;
break;
default:
i++;
break;
}
}
else printch(format[i]);
}
va_end (args);
}
有谁知道这里发生了什么以及如何解决它?请帮忙!
【问题讨论】:
标签: c string operating-system printf standard-library