在上一次編程作業中,我們應該實現一個printf而不使用va_list。我無法工作。這裏是我的嘗試:在沒有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'之後,但另一個缺陷是'char'在調用'printf'時被提升爲'int'。 –
假設這並不意味着可移植...什麼平臺? 32位? 64位? – Dmitri