Załóżmy, że masz ciąg, który NIE jest null
zakończony i znasz jego dokładny rozmiar, więc jak możesz wydrukować ten ciąg printf
w C? Pamiętam taką metodę, ale nie mogę się teraz dowiedzieć ...
Załóżmy, że masz ciąg, który NIE jest null
zakończony i znasz jego dokładny rozmiar, więc jak możesz wydrukować ten ciąg printf
w C? Pamiętam taką metodę, ale nie mogę się teraz dowiedzieć ...
Odpowiedzi:
Jest taka możliwość z printf, wygląda to tak:
printf("%.*s", stringLength, pointerToString);
Nie ma potrzeby kopiowania czegokolwiek, nie ma potrzeby modyfikowania oryginalnego ciągu lub bufora.
printf
nawet po ~ dekadzie ... :)
printf
wydrukuje do 11 znaków lub do momentu napotkania wartości NULL, w zależności od tego, co nastąpi wcześniej; w twoim przykładzie NULL jest na pierwszym miejscu. Określenie maksymalnej długości nie powoduje, że NULL traci swoje znaczenie „końca łańcucha” dla printf
.
Oto wyjaśnienie, jak %.*s
działa i gdzie jest określone.
Specyfikacje konwersji w ciągu szablonu printf mają ogólną postać:
% [ param-no $] flags width [ . precision ] type conversion
lub
% [ param-no $] flags width . * [ param-no $] type conversion
Druga forma służy do uzyskania dokładności z listy argumentów:
Możesz również określić dokładność „*”. Oznacza to, że następny argument z listy argumentów (przed rzeczywistą wartością do wydrukowania) jest używany jako precyzja. Wartość musi być liczbą całkowitą i jest ignorowana, jeśli jest ujemna.
- Składnia konwersji danych wyjściowych w podręczniku glibc
W przypadku %s
formatowania ciągów precyzja ma specjalne znaczenie:
Można określić precyzję, aby wskazać maksymalną liczbę znaków do zapisania; w przeciwnym razie do strumienia wyjściowego zapisywane są znaki w ciągu do, ale bez kończącego znaku null.
- Inne konwersje danych wyjściowych w podręczniku glibc
Inne przydatne warianty:
"%*.*s", maxlen, maxlen, val
wyrówna do prawej, wstawiając spacje przed;"%-*.*s", maxlen, maxlen, val
uzasadni do lewej."%-*.*s", padding, str_view.size(), str_view.data()
Możesz użyć fwrite () do wyjścia!
fwrite(your_string, sizeof(char), number_of_chars, stdout);
W ten sposób wypisujesz pierwsze znaki (liczbę zdefiniowaną w zmiennej number_of_chars) do pliku, w tym przypadku na stdout (standardowe wyjście, twój ekran)!
printf("%.*s", length, string)
nie będzie działać.
Oznacza to wydrukowanie do długości bajtów LUB bajtu zerowego, cokolwiek nastąpi wcześniej. Jeśli twoja tablica znaków zakończona wartością zerową zawiera bajty o wartości null PRZED długością, printf zatrzyma się na nich i nie będzie kontynuował.
#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;
}
Zredagowałem kod, oto 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;
}
C
kontekście wszystkie ciągi są zakończone wartością null. Tablice znaków bez null w nich nie są łańcuchami ... są tablicami znaków :)