最後のプログラミングの宿題では、va_listを使用せずにprintfを実装することになっていました。私は私の仕事を得ることができませんでした。ここに私の試みだった:va_listなしでprintfを実装する
#include<stdio.h>
#include<stdarg.h>
#include <string.h>
#include <stdlib.h>
int myprintf(const char * format, ...)
{
void *traverse = &format;
traverse += sizeof(char*);
int i,j;
char k;
char * str;
for (i = 0; i < strlen(format); i++)
{
if (format[i] == '%')
{
switch (format[i+1])
{
case 's':
str = *((char**)traverse );
for (j = 0; j < strlen(str); j++)
{
k = str[j];
putchar(k);
}
traverse += sizeof(char*);
break;
case 'd':
j = *((int*)traverse);
putchar(j);
traverse += sizeof(int*);
break;
case 'c':
k = *((char*)traverse);
putchar(k);
traverse += sizeof(char*);
break;
case '%' :
putchar('%');
break;
}
i++;
}
else
{
putchar(format[i]);
}
}
}
int main()
{
char k = 'a';
int g = 6;
myprintf("Hello, this is %d How are You", 6);
}
出力されたと私はそれは次のようになり、予想通りのint 6が印刷されていなかった「こんにちは、これはあなたのある方法です」。コードに何が間違っているのでしょうか?ありがとう!いくつかの人々がに言及しているものを要約する
"コードには何が付いていますか?" - >コードは移植可能な機能コードのために 'va_list'を使う必要があります。このコードが正しく動作するようにするための前提は、せいぜい実装の定義と最悪の未定義の動作です。 – chux
実際の問題ではありませんが、 '%d'の後に' int 'のサイズではなく、ポインタのサイズだけ進むのはなぜですか?ポインターではなく、 'int'が渡されました。同様に '%c'の後には、' printf'の呼び出しで 'char'が' int'に昇格するという追加の落とし穴があります。 –
これは移植可能ではないと仮定します...どのプラットフォームですか? 32ビット? 64ビット? – Dmitri