C variadic函数如何从输入中获取字符串

时间:2011-09-07 08:22:10

标签: c variadic

我想从我的可变参数函数输入值中获取一个字符串(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);

有什么想法吗?

1 个答案:

答案 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