OS를 작성 중이며 printf()
기능을 만드는 데 문제가있었습니다.수제 printf() 함수에서 16 진수가 제대로 인쇄되지 않습니다.
%가 있음을 확인했습니다 이제 다음 문자가 무엇인지 알아 내기 위해 노력하고있다 switch 문을 통과 할 때, 이런 :
print(string str)
가 stdout
에 문자열 str을 인쇄합니다 (그러나없이 % 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에서 % 내가 정확히 무엇을해야하지만, 입력이 어떤 이유로 미만 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);
}
사람이 여기에가는 방법을 수정하는 것입니다 무엇을 알고 있나요? 도와주세요!
을 그냥 내 앞에'const를 문자열 str2' 할당 전혀 기억이 없습니다. –
고마워요! 나는 주요 아이디어를 알아 냈다. 그러나 sizeof (buf2)와 같은 세부 사항 중 일부는 잘못된 것입니다. 기본 작업에 대한 좋은 생각이 아닙니다. 작업 한 내용을 약간 편집하고 받아 들일 것입니다. –