Załóżmy, że masz napis, który NIE jest null
zakończony i znasz dokładny rozmiar, więc jak możesz wydrukować ten ciąg z printf
w C? Pamiętam taką metodę, ale nie mogę dowiedzieć się, teraz ...Używanie printf z nie kończącym się łańcuchem znaków
Odpowiedz
Istnieje możliwość z printf, to idzie tak:
printf("%.*s", stringLength, pointerToString);
Nie ma potrzeby, aby skopiować wszystko, nie ma potrzeby modyfikowania oryginał ciąg lub bufor.
Ale w każdym razie jest to niebezpieczne, ktoś pewnego dnia wydrukuje ten ciąg z% s – pmod
Tak, to jest to! – whoi
@Pmod: Niekoniecznie, jeśli bufor nie jest wystawiony na działanie zewnętrznego świata. Jest również bardzo przydatne, aby wydrukować * części * ciągu znaków (oczywiście może to być wartość pusta). Jeśli naprawdę chcesz zobaczyć to w akcji, spójrz na serwer proxy OpenSER/Kamailio SIP, gdzie unika się kopiowania ze względu na tę technikę (również za pomocą sprintf). – DarkDust
#include<string.h>
int main()
{
/*suppose a string str which is not null terminated and n is its length*/
int i;
for(i=0;i<n;i++)
{
printf("%c",str[i]);
}
return 0;
}
edytowany kod, herezje inny sposób:
#include<stdio.h>
int main()
{
printf ("%.5s","fahaduddin");/*if 5 is the number of bytes to be printed and fahaduddin is the string.*/
return 0;
}
Bardzo zła wydajność ze względu na mnóstwo niepotrzebnych odczytów bajtów (które są objęte karą za wydajność jeśli bajt nie znajduje się na adresie wyrównanym do słów na większości procesorów), a także formatowanie i stosowanie jest wykonywane dla każdego znaku. Nie rób tego :-) Zobacz moją odpowiedź na rozwiązanie. – DarkDust
Dzięki za wzmiankę o –
@DarkDust: tylko maszyna patologiczna będzie karać bajtów czyta nie wyrównane do granic słów. Czy myślisz o tym, że odczyty słów nie są wyrównane do granic słów? A może jakieś staromodne bzdury czy coś takiego? –
printf("%.*s", length, string)
nie zadziała.
Oznacza to, że należy wydrukować UP TO length bytes LUB bajt zerowy, zależnie od tego, co nastąpi wcześniej. Jeśli Twoja tablica-znaków z zakończonymi znakami NU zawiera bajty o wartości NUŻEJ, to printf zatrzyma się na nich i nie będzie kontynuował.
Możesz użyć fwrite() na standardowe wyjście!
fwrite(your_string, sizeof(char), number_of_chars, stdout);
ten sposób wyświetli pierwszych znaków (liczba określona w number_of_chars zmiennych) do pliku, w tym przypadku na stdout (standardowe wyjście, ekran)!
Bardzo pomocne, gdy chcesz sprawdzić długi bufor zawierający ciągi i zera! – Elist
Oto wyjaśnienie, jak działa %.*s
i gdzie jest określony.
Specyfikacje konwersji w ciąg szablonu printf mają ogólną postać:
% [ param-no $] flags width [ . precision ] type conversion
lub
% [ param-no $] flags width . * [ param-no $] type conversion
Druga forma jest dla uzyskania dokładności z listy argumentów:
Możesz także określić dokładność "*". Oznacza to, że następny argument na liście argumentów (przed faktyczną wartością do wydrukowania) jest używany jako dokładność. Wartość musi być int i jest ignorowana, jeśli jest ujemna.
- Output conversion syntax w instrukcji glibc
Dla %s
formatowania strun, precyzja ma szczególne znaczenie:
Precyzyjny można określić, aby wskazać maksymalną liczbę znaków do zapisu; w przeciwnym razie znaki w łańcuchu do kończącego znaku pustego, ale bez niego, zostaną zapisane w strumieniu wyjściowym.
- w podręczniku glibc
Inne użyteczne warianty:
"%*.*s", maxlen, maxlen, val
będzie prawym uzasadnić, wstawianie spacji przed;"%-*.*s", maxlen, maxlen, val
Zostanie wyjustowany.
Jeśli dobrze rozumiem, następujące elementy padłyby na wyjście, ale nadal zapobiegają przepełnieniu łańcucha? '"% - *. * S ", dopełnienie, str_view.size(), str_view.data()' – scx
printf("%.5s", pointerToNonNullTerminatedString);
Długość ciąg będzie 5.
- 1. Manipulowanie łańcuchem o długości 30 milionów znaków
- 2. Dziel się łańcuchem na każdej n-tej pozycji z JavaScript?
- 3. Używanie printf jako funkcji ponownego wejścia C
- 4. Łańcuchy centrujące z printf()
- 5. vim - Zatrzymaj przewijanie po pierwszym pliku kończącym się
- 6. co jest nie tak z łańcuchem połączenia sql lite?
- 7. przykładowy kod z długim łańcuchem?
- 8. Struny i charakter z printf
- 9. Używanie boost :: tokenizer z ogranicznikami ciągów znaków
- 10. Dlaczego ciało odpowiedzi szafy nie jest łańcuchem?
- 11. json_encode nie działa z łańcuchem html jako wartością
- 12. Wzorzec adresu URL serwletu zgodny z adresem URL kończącym się ukośnikiem ("/")
- 13. Windows8 - Używanie zlokalizowanego ciągu znaków w języku C#
- 14. x: Bind obraz z łańcuchem pustym
- 15. NetworkInterface.getNetworkInterfaces() generuje wyjątek z pustym łańcuchem komunikatów
- 16. format printf w .NET
- 17. bash printf z nową linią
- 18. Używanie znaków wieloznacznych wewnątrz pg_prepare
- 19. Dlaczego nie piszemy int x = printf ("tekst"); ponieważ instrukcja printf() zwraca za każdym razem wartość całkowitą?
- 20. printf i zasady formatowania
- 21. printf Format pływak z wyściółką
- 22. określ wartość może być łańcuchem lub pustą z json schematu
- 23. Specyfikator szerokości w printf nie działa poprawnie z akcentowanymi znakami.
- 24. django fuzzy ciąg znaków nie pojawia się
- 25. Funkcja wywołania C z zestawu - aplikacja zatrzymuje się na "call printf" i nie mam pojęcia, dlaczego
- 26. Maksymalna liczbowa gęstość informacji z printf
- 27. Używanie znaków Unicode większych niż 2 bajty z .Net
- 28. printf zmiennej String Długość Specyfikator
- 29. Używanie * z: nie w css
- 30. wyszukiwania słowa z powtarzających się znaków
'W kontekście C', wszystkie ciągi są zerowa zakończone. Tablice znaków bez wartości zerowej nie są ciągami znaków ... są tablicami znaków char :) – pmg
możliwy duplikat [Jak mogę wydrukować łańcuch zakończony znakiem null za pomocą printf?] (Http://stackoverflow.com/ pytania/2137779/how-do-i-print-a-non-null-ended-string-using-printf) – Justin
https://stackoverflow.com/questions/2239519/is-there-a-way-to-specify -how-many-characters-of-a-string-to-print-out-using-pri –