可変数の文字列を連結する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);
はそうでない場合、私は、メモリリークを持って...
関数int2str()を関数texto()で使用することはできますが、パラメータのタイプをチェックする方法はわかりません。
Ps:私は自分のコードにC++を使用していません。
"私はコードをC++ではなくCを使用しています。" 'inline'はC++キーワードであり、Cキーワードではありません。 – Constantinius
gcc固有の解決策が受け入れられるでしょうか? – Flexo
@ Constantinius - 私はC99も 'インライン'を追加したと思った? – Flexo