2017-11-28 5 views
-3

va_listを使わずに独自のprintfとscanfを書く必要があります。私はprintfを実装しました。scanfを書くときはそれを基にしたいと思いますが、この場合ポインタの扱い方はわかりません。どのように症例のように見えるか教えていただけますか?va_listを持たない私のscanf

void myprintf (char *format, ...) { 

    char *p = (char *) &format + 12 * sizeof(int); 
    char *s = format; 
    int number; 
    char** string; 

    for(; *s != '\0'; ++s) { 
     if (*s == '%') { 
      switch (*(s+1)) 
      { 
       case 's': 
       string = (char**) p; 
       write(1, string[0], strlen(string[0])); 
        p += 2 * sizeof(int); 
        ++s; 
        break; 
       case 'd': 
        number = *((int *)p); 
        write(1,intToArray(number),strlen(intToArray(number))); 
        p += 2 * sizeof (int); 
        ++s; 
        break; 
       default: 
        write(1, "%", 1); 
      }  
     } else { 
      write(1, s, 1); 
     } 
    } 
} 
+4

あなたのコードは、例えば上で動作しません。 ARM、RISC-V、またはIBM Zシリーズをサポートします。 –

+2

@BasileStarynkevitchそれは彼の宿題とは無関係です。もちろん... – Ctx

答えて

3

あなたはva_listなし移植性可変引数関数を記述することはできません。

va_startva_argva_endマクロはコンパイラマジック(例えばコンパイラ組み込み)に変換されます。

これはABIの規則に拘束されているためです(宿題については、x86 ABI listも参照してください)。例えば

/usr/lib/gcc/x86_64-linux-gnu/7/include/stdarg.hが含まれています

#define va_start(v,l) __builtin_va_start(v,l) 
関連する問題