【发布时间】:2020-09-09 10:54:42
【问题描述】:
我正在尝试编写一个代码,该代码采用一个缓冲区、一个格式字符串和三个指向值的 void 指针,并组成一个具有相同文本的字符串,如果在 printf 上使用格式,则该字符串将被打印。指向的值应替换格式字符串中的 3 个占位符。我开始只为%c 占位符的情况编写代码,并且缓冲区似乎包含随机字符而不是被指向的字符。任何帮助将不胜感激:
#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";
int 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;
}
【问题讨论】:
-
旁白:极端情况错误:请注意,如果格式是意外的“abc %”,代码将增加
format超过'\0';建议if(*format == 'c') { .... } else { *buffer = '\0'; return 0; }尽早退出解析,不要走得太远。
标签: c pointers format printf buffer