Построение строк из переменных в C - PullRequest
16 голосов
/ 03 февраля 2011

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

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

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

ОДНАКО , поиск в Google привел меня к выводу, что возвращаемое значение printf является целым числом числа вывода Char, не char [] самих символов (как я надеялся).

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

Ответы [ 3 ]

27 голосов
/ 03 февраля 2011

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

char buffer[1024];
snprintf(buffer, sizeof(buffer), "Dealer's Card is %C %C", char1, char2);
8 голосов
/ 03 февраля 2011

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

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

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

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

0 голосов
/ 08 марта 2014

Если вы хотите, чтобы строковый конструктор в 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 заявление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...