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

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

Я Надежда я мог бы сделать что-то вроде этого:

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

, googling приводит меня к определению того, что возвращаемое значение printf является int числа вывода Char,не символ [] самих символов (как я надеялся).

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

3 ответов


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

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

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

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

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

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


Если вам нужен строитель строк в 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 заявление.