Строковые строки из переменных в 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
.