我想从我的可变参数函数输入值中获取一个字符串(const char *)。 但是下面的代码不起作用.....运行时错误是结果
void print(const char fmt[], ...) {
va_list ap;
const char *p=fmt;
va_start(ap,fmt);
while(*p) {
if(*p == '%') {
p ++;
if (*p == 'i') {
int num = va_arg(ap, int);
fprintf(output, "%d", num);
} else if (*p == 'f') {
float num = va_arg(ap, float);
fprintf(output, "%f", num);
} else if (*p == 's') {
const char* str = va_arg(ap, const char*);
fprintf(output, "%s", str);
} else
break;
p ++;
} else
break;
}
va_end(ap);
}
// This is how I call the function:
print("%s%f", "Num: ", 12.34);
有什么想法吗?
答案 0 :(得分:0)
毫无疑问,你在代码的某些部分没有显示[编辑:或当时没有显示]。这是我多年前写的printf
(和家庭)模仿(完全不完整)。它不实现通常的宽度/精度/标志/等,但适用于简单的事情,如%d,%s等。
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
int my_vfprintf(FILE *file, char const *fmt, va_list arg) {
int int_temp;
char char_temp;
char *string_temp;
char ch;
int length = 0;
char buffer[512];
while ( ch = *fmt++) {
if ( '%' == ch ) {
switch (ch = *fmt++) {
/* %% - print out a single % */
case '%':
fputc('%', file);
length++;
break;
/* %c: print out a character */
case 'c':
char_temp = va_arg(arg, int);
fputc(char_temp, file);
length++;
break;
/* %s: print out a string */
case 's':
string_temp = va_arg(arg, char *);
fputs(string_temp, file);
length += strlen(string_temp);
break;
/* %d: print out an int */
case 'd':
int_temp = va_arg(arg, int);
itoa(int_temp, buffer, 10);
fputs(buffer, file);
length += strlen(buffer);
break;
/* %x: print out an int in hex */
case 'x':
int_temp = va_arg(arg, int);
itoa(int_temp, buffer, 16);
fputs(buffer, file);
length += strlen(buffer);
break;
}
}
else {
putc(ch, file);
length++;
}
}
return length;
}
int my_printf(char const *fmt, ...) {
va_list arg;
int length;
va_start(arg, fmt);
length = my_vfprintf(stdout, fmt, arg);
va_end(arg);
return length;
}
int my_fprintf(FILE *file, char const *fmt, ...) {
va_list arg;
int length;
va_start(arg, fmt);
length = my_vfprintf(file, fmt, arg);
va_end(arg);
return length;
}
#ifdef TEST
int main() {
my_printf("%s", "Some string");
return 0;
}
#endif