Строковые строки из переменных в C

Я работаю над игрой в блэкджек с голыми костями, в которой используются сокеты, любезно предоставленные моим классом операционных систем. Нам был предоставлен интерфейс сокета, который передает массив символов назад и вперед.

Я надеялся, что смогу сделать что-то вроде этого:

char[] msgOut = printf("Dealer Card is %C %C", char1, char2);
sendMsg(msgOut);

HOWEVER, googling заставляет меня определить, что возвращаемое значение printf является int числа вывода Char, не a char [] of (как я и надеялся).

Есть ли другая функция C, которая позволяет мне создавать строки из моих переменных?

Ответ 1

printf записывается на стандартный вывод. snprintf выполняет то, что вы здесь делаете. Интерполированная строка сохраняется в "буфере" после вызова snprintf. Возможно, вы захотите определить свой размер буфера немного более разумно, но это всего лишь пример.

char buffer[1024];
snprintf(buffer, sizeof(buffer), "Dealer Card is %C %C", char1, char2);

Ответ 2

Glibc (и несколько других библиотек C) имеют функцию удобства asprintf.

char *msgOut;
asprintf(&msgOut, "Dealer Card is %C %C", char1, char2);
sendMsg(msgOut);
free(msgOut);

Это наиболее полезно, если у вас нет хорошего предварительного предсказания для объема памяти, необходимого для хранения строки. (Если вы это делаете, snprintf имеет меньше накладных расходов, так как он не динамически выделяет память.)

В системах без asprintf, но со стандартным snprintf, он может быть реализован двумя вызовами snprintf - сначала без буфера и нулевого размера для определения длины строки, промежуточного malloc, а затем второй раз, используя это новое выделенное пространство.

Ответ 3

Если вам нужен построитель строк в c, который динамически выделяет память, я нашел http://linux.die.net/man/3/vasprintf.

Пример:

#include <stdio.h>

int i;
printf("//Simple dynamic string builder:\n");
char *strs[6] = {"I","am","an","array","of","strings"};

char *buf = "["; // open bracket
for (i=0;i<6;i++) {
    // Dynamically build and allocate memory
    asprintf(&buf,"%s%s",buf,strs[i]);
    if(i!=5) { // Add a comma , after each but skip the last
        asprintf(&buf,"%s,",buf);
    }
}
asprintf(&buf,"%s]",buf); // closing backet
printf("\"%s\"\n",buf);

Выходной сигнал

//Simple string builder:
"[I,am,an,array,of,strings]"

поэтому char *buf динамически расширяется на asprintf и строит, форматируя себя в инструкции asprintf.