2011-02-03 14 views
13

Pracuję nad prostą grą w blackjacka, która korzysta z gniazd, dzięki uprzejmości mojej klasy systemów operacyjnych. Dostaliśmy już interfejs gniazda, który przekazuje tablicę znaków w tę iz powrotem.Budowanie ciągów ze zmiennych w C

miałem nadzieję mógłby zrobić coś takiego:

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

JEDNAK, googlowania prowadzą mnie do stwierdzenia, że ​​wartość zwracana printf jest int liczby wyjściu Chara, nie char [] samych znaków (tak jak się spodziewałem).

Czy istnieje inna funkcja C, która pozwala na tworzenie ciągów z moich zmiennych?

Odpowiedz

23

printf zapisuje na standardowe wyjście. snprintf osiąga to, co zamierzacie tutaj. Interpolowany łańcuch jest przechowywany w "buforze" po wywołaniu snprintf. Możesz chcieć zdefiniować swój rozmiar bufora nieco bardziej inteligentnie, ale to tylko przykład.

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

Nie, spójrz na przykład. Bufor zostanie zmodyfikowany w miejscu. Wiele funkcji w kodach błędów powrotu C i modyfikowanie ich argumentów w miejscu. Musisz przyzwyczaić się do tego kodu pisania w C. –

+0

Tak. Krótkowzroczność z mojej strony. Ponownie przeczytałem twoje odpowiedzi po napisaniu tego komentarza. –

+1

@EdS .: Jak dodać "bufor". Powiedzmy, że chcę wywołać 'snprintf' na' buffer' wiele razy, ale nie chcę aby tekst wewnątrz 'bufora' został nadpisany. – arunmoezhi

8

Glibc (i kilka innych bibliotek c) posiada funkcję ogólnospożywczy asprintf.

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

Jest to najbardziej przydatne, gdy nie masz dobrej prognozy wyprzedzenia dla ilości pamięci, która jest wymagana do przechowywania ciąg. (Jeśli tak, snprintf ma mniejszy narzut, gdyż nie dynamicznie przydzielać pamięć.)

W systemach bez asprintf, ale zgodnym ze standardami snprintf, może on być realizowany przez dwa zaproszenia do snprintf - najpierw bez bufora i zerowy rozmiar w celu określenia długości łańcucha, interweniującego malloc, a następnie po raz drugi z wykorzystaniem nowo przydzielonej przestrzeni.

0

Jeśli chcesz budować ciąg w c, który dynamicznie przydziela pamięć, znalazłem http://linux.die.net/man/3/vasprintf, aby było użyteczne.

przykład:

#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); 

Wyjście jest

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

tak char *buf dynamicznie jest rozszerzana przez asprintf i buduje formatowania się do rachunku asprintf.

+0

Wystarczy wziąć pod uwagę fakt, że 'asprintf' jest rozszerzeniem GNU, a nie metodą de facto C/POSIX. –

Powiązane problemy