2016-06-19 6 views
1

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); 
} 

사람이 여기에가는 방법을 수정하는 것입니다 무엇을 알고 있나요? 도와주세요!

답변

2

관련없는 코드를 주석 처리하면 문제의 코드가 "작동"하게 될 때 정의되지 않은 동작을보고 있음을 확신 할 수 있습니다. 코드가 실제로 "작동하지"않습니다. 출력에서 자체적으로 나타나는 오류는 발생하지 않습니다.

상황에 따라 itoa에 전달하는 버퍼에 문제가있는 것처럼 보입니다. 버퍼를 전달하는 대신 빈 문자열을 전달하게됩니다. 당신은 itoa에 작은 버퍼를 전달에만 다음과 같이 그것에서 문자열을 구성해야합니다

char buf2[17]; 
itoa(va_arg(args, int), buf2, sizeof(buf2)); 
const string str2(buf2, sizeof(buf2)); 
+1

을 그냥 내 앞에'const를 문자열 str2' 할당 전혀 기억이 없습니다. –

+0

고마워요! 나는 주요 아이디어를 알아 냈다. 그러나 sizeof (buf2)와 같은 세부 사항 중 일부는 잘못된 것입니다. 기본 작업에 대한 좋은 생각이 아닙니다. 작업 한 내용을 약간 편집하고 받아 들일 것입니다. –