2009-11-20 14 views
5

Normalnie można wydrukować ciąg w C tak ..format string w C

printf("No record with name %s found\n", inputString); 

Ale chciałem zrobić łańcuch z niego, w jaki sposób mogę to zrobić? Szukam czegoś takiego ..

char *str = ("No record with name %s found\n", inputString); 

Mam nadzieję, że jest jasne, co szukam ...

+3

Zrób sobie przysługę i iść kupić "The C Programming Language" przez Kernigham & Ritchie. – Pete

+1

Dzięki, Pete, zrobię to. – itsaboutcode

+0

http://www.eskimo.com/~scs/cclass/cclass.html –

Odpowiedz

31

Jedną z opcji byłoby wykorzystanie sprintf, który działa podobnie jak printf ale przyjmuje jako pierwszy parametr to wskaźnik do bufora, w którym powinien umieścić wynikowy ciąg znaków.

Zalecane jest użycie parametru snprintf, który pobiera dodatkowy parametr zawierający długość bufora, aby zapobiec przepełnieniu bufora. Na przykład:

char buffer[1024]; 
snprintf(buffer, 1024, "No record with name %s found\n", inputString); 
3

Spójrz na sprintf (patrz poniżej).

int n = sprintf(str, "No record with name %s found\n", inputString); 
3

Zastosowanie

sprintf(str, "No record with name %s found\n", inputString); 
10

Patrzysz dla rodziny funkcji sprintf. Ich ogólny format:

char output[80]; 
sprintf(output, "No record with name %s found\n", inputString); 

Jednak sprintf sama jest niezwykle niebezpieczne. Jest podatny na coś, co nazywa się przepełnieniem bufora. Co to oznacza, że ​​sprintf nie ma pojęcia, jak duży jest ciąg znaków output, więc chętnie napisze do niego więcej danych, niż jest to możliwe. Na przykład, będzie to skompilować czysto, ale nadpisze poprawny pamięć — i nie ma sposobu, aby sprintf wie, że robi coś złego:

char output[10]; 
sprintf(output, "%s", "This string is too long"); 

Rozwiązaniem jest użycie funkcji jako snprintf, która przyjmuje długość parametr:

char output[10]; 
snprintf(output, sizeof output, "%s", "This string is too long, but will be truncated"); 

lub, jeśli jesteś na systemie Windows, aby skorzystać z _sntprintf warianty i przyjaciół, które chronią przed przepełniona albo ciągów wejściowych lub wyjściowych.

+3

Jako że jest to zadanie domowe, chciałbym tylko zwrócić uwagę, że 'sizeof output' podaje tylko liczbę * elementów * w char 'tablica - zwyczajowa praktyka to:' tablica sizeof/tablica sizeof [0] ', która działa bez zależności od rozmiaru różnych typów. Dodatkowo działa również dla tablic "char". :) –

+0

Dobra uwaga. Jednak nawet to może zawieść w niektórych bardzo typowych przypadkach, takich jak przekazywanie 'tablica' do funkcji - w którym to momencie 'tablica rozmiarów' jest 4 lub 8 w każdym nowoczesnym systemie, niezależnie od liczby i rozmiaru elementów w nim.Prawdziwym rozwiązaniem jest użycie 'std :: vector' lub czegoś podobnego i unikanie całego bałaganu w całości. –

7

Ponieważ jest to praca domowa (dzięki za oznaczenie jako takie), zasugeruję, aby przyjrzeć się rodzinie funkcji ...printf().

Jestem pewien, że znajdziesz rozwiązanie :)

+3

Cóż, wygląda na to, że inni pozbawili cię przyjemności odkrywania :) –

+1

+1 i tak za udzielenie odpowiedniego rodzaju odpowiedzi na pytanie domowe. –