【问题标题】:problem with sprintf implementation via pointers通过指针实现 sprintf 的问题
【发布时间】:2020-09-09 08:11:35
【问题描述】:

我正在尝试编写一个函数,该函数接受一个缓冲区、一个格式字符串和三个指向值的 void 指针,并使用与 printf 上使用格式时将打印的相同文本组成一个字符串。指向的值应替换格式字符串中的 3 个占位符。 我开始只为%c 占位符的情况编写代码,并且它有很多错误(应该忽略的无效值,取消引用void * 指针)可能主要功能也有问题:

编辑:

感谢响应者,我已经更改了一些代码,现在我将其作为缓冲区值:

你有�美元,你的名字是�,你的信是�


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int format_to_string(char *buffer, char *format, void *arg1, void *arg2, void
*arg3);
int main(){
char format[20] = "%c bla %c bla %c";
char v1='5'; 
char v2 ='c';
char v3 = 'F';
void *arg1 = &v1;
void *arg2 = &v2;
void *arg3 = &v3;
char str[20];
char *buffer = str;
format_to_string(buffer,format, &arg1, &arg2,&arg3);
printf("%s",buffer);
return 0;

}
int format_to_string(char *buffer, char *format, void *arg1, void *arg2, void
*arg3)
{
    int counter = 0;
    for(int i=0; *format != '\0'; format++, buffer++ )
    {
        if( *format != '%')
        {
            *buffer = *format;
        }
        else
        {
            format++;
            if(*format == 'c')
            {
                if(counter == 0)
                {
                    *buffer =*(char*)arg1;
                    counter++;
                    continue;
                }
                if(counter == 1)
                {
                    *buffer =*(char*)arg2;
                    counter++;
                    continue;
                }
                if(counter == 2)
                {
                    *buffer =*(char*)arg3;
                    counter++;
                    continue;
                }
            }    
        }

    }   
    *buffer = '\0';
    return 0;
}

【问题讨论】:

  • 那些错误会是......?
  • 你有char *buffer 所以*buffer = *arg1; 应该是*buffer = *(char *)arg1;
  • 您似乎将一个非零终止缓冲区传递给printf。您的 format_to_string 不完整,这没关系,但它在退出之前不会添加零终止符。根据str[80] 结束后内存中的内容,您很可能会得到一些随机字符的输出,然后是未定义的行为。此外,检查您对缓冲区位置的分配。你传递的指针是void * 并且void 没有指定它指向的对象的大小,所以你需要根据你的格式字符指示来转换每个参数。
  • @yossman 你的格式字符串里面是不是只有%c,参数都是char类型变量的地址?在退出之前,您仍然没有添加零终止符。

标签: c pointers void-pointers


【解决方案1】:

这个电话,

format_to_string(buffer,format, &amp;arg1, &amp;arg2,&amp;arg3);

将三个指针的地址传递给您的变量,而不是变量本身的地址。

改成,

format_to_string(buffer,format, &amp;v1, &amp;v2, &amp;v3);

format_to_string(buffer,format, arg1, arg2, arg3);

然后再试一次。

【讨论】:

    猜你喜欢
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2023-04-07
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多