簡體   English   中英

將具有可變數量參數的函數中的文本與數字連接

[英]Concatenate text with numbers in a function with variable number of parameters

我用C語言編寫了一個函數,該函數連接了可變數目的字符串。 那是我的代碼:

char* texto(const char* s, ...){
        va_list args;
        char *tmp;
        char *res;
        size_t len = strlen(s);

        // pega um handle ao início da lista de parâmetros
        va_start(args, s);
        // calcula o tamanho total de todas as strings - pega o próximo parâmetro da lista, até chegar no NULL
        while ((tmp = va_arg(args, char*))){
            len += strlen(tmp);
        }
        va_end(args);

        res = malloc(len+1);
        if (!res){
                fprintf(stderr, "Erro ao alocar string. Função 'texto'\n");
                exit(EXIT_FAILURE);
        }

        // cria a string concatenada
        strcpy(res, s);

        va_start(args, s);
        // pega o próximo parâmetro da lista, até chegar no NULL
        while ((tmp  = va_arg(args, char*))){ 
            strcat(res, tmp); 
        }
        va_end(args);

        return res;
}

我正在這樣使用:

char* txt = texto("a", "b", "c", "d", "e", NULL);
//txt is now: "abcde"

工作正常。 但是我不能將數字參數傳遞給此函數,只能傳遞字符串。 我需要更改功能才能像這樣工作:

char* txt = texto("a", "b", 1, "d", 4.5, "e", NULL);
//txt is now: "ab1d4.5e"

我怎樣才能做到這一點? 如何使用va_arg()獲取具有不同類型的參數?

我到目前為止發現的解決方案是創建一個函數int2str():

inline char* int2str(int inteiro){
    char* str = malloc(10);
    sprintf(str, "%d", inteiro);
    return str;
}

但是我必須使用這種方式:

char* txtnum = int2str(23);
char* txt = texto("a", txtnum, NULL);
free(txtnum);

否則,我會發生內存泄漏...

我可以在texto()函數中使用int2str()函數,但我不知道如何檢查參數的類型!

附言:我的代碼不是C ++,而是C語言。

我怎樣才能做到這一點? 如何使用va_arg()獲取具有不同類型的參數?

不幸的是,這是不可能的,當您使用變量參數列表時,類型信息會丟失。

一個很簡單的解決方案是使用一個聲明“類型”的格式字符串,但是,為什么不簡單地使用標准函數snprintf呢? 參考這里

char buffer[256];
snprintf(buffer, sizeof(buffer), "%s%s%d%s%f%s", "a", "b", 1, "d", 4.5, "e", NULL);

如果您願意采用特定於gcc的解決方案,則可以將int2str更改為以下宏:

# define int2str(i)                                                           \
  (__extension__                                                              \
    ({                                                                        \
      char *new = (char *) __builtin_alloca (10);                        \
      sprintf(new, "%d", i); \
      new;                                  \
    }))

這意味着您可以編寫:

char* txt = texto("a", int2str(23), NULL);

沒有泄漏。 這是非常不便攜雖然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM