gpt4 book ai didi

c - 不使用 va_list 实现 printf

转载 作者:行者123 更新时间:2023-11-30 19:34:47 27 4
gpt4 key购买 nike

在上一个编程作业中,我们应该在不使用 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);

}

输出是“Hello, this is How are You”,并且 int 6 没有按照我的预期打印。知道代码有什么问题吗?谢谢!

最佳答案

总结几个人提到的内容:

printf 采用可变长度参数列表。要访问这些参数,您需要了解参数如何传递给函数的机制。 C 规范强调避免声明像这样的低级事物应该如何工作;不同平台的情况会有所不同。相反,C 标准要求将所有这些特定于平台的内容包装在标准化接口(interface)后面,并将其称为 stdarg.h

这意味着这里有两种可能的结果。您的导师要么希望您得出结论,它无法在标准 C 中完成,并更深入地了解为什么 stdarg.h 存在,要么他们希望您做一些极其特定于平台的事情。如果是后者,那么这不是一个 C 问题(您将调用大量未定义的行为并超出语言规范),这是一个有关您平台的低级接口(interface)的问题。您需要详细解释您的处理器架构和 ABI 版本,然后我们才能为您提供帮助。

关于c - 不使用 va_list 实现 printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43399724/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com