Предположим, у вас есть строка, которая НЕ null
заканчивается, и вы знаете ее точный размер, так как же вы можете распечатать эту строку с помощью printf
C? Я припоминаю такой метод, но сейчас не могу узнать ...
Предположим, у вас есть строка, которая НЕ null
заканчивается, и вы знаете ее точный размер, так как же вы можете распечатать эту строку с помощью printf
C? Я припоминаю такой метод, но сейчас не могу узнать ...
Ответы:
Есть возможность с printf, это выглядит так:
printf("%.*s", stringLength, pointerToString);
Не нужно ничего копировать, не нужно изменять исходную строку или буфер.
printf
даже через ~ десятилетие ... :)
printf
будет печатать до 11 символов или пока не встретится NULL, в зависимости от того, что наступит раньше; в вашем примере сначала идет NULL. Указание максимальной длины не приводит к тому, что NULL теряет свое значение "конец строки" printf
.
Вот объяснение того, как это %.*s
работает, и где это указано.
Спецификации преобразования в строке шаблона printf имеют общий вид:
% [ param-no $] flags width [ . precision ] type conversion
или
% [ param-no $] flags width . * [ param-no $] type conversion
Вторая форма предназначена для получения точности из списка аргументов:
Вы также можете указать точность «*». Это означает, что следующий аргумент в списке аргументов (перед фактическим значением, которое будет напечатано) используется в качестве точности. Значение должно быть целым числом и игнорируется, если оно отрицательное.
- Синтаксис преобразования вывода в руководстве по glibc
Для %s
форматирования строк точность имеет особое значение:
Можно указать точность, чтобы указать максимальное количество символов для записи; в противном случае символы в строке до завершающего нулевого символа, но не включая его, записываются в выходной поток.
- Другие преобразования вывода в руководстве по glibc
Другие полезные варианты:
"%*.*s", maxlen, maxlen, val
будет выравниваться по правому краю, вставляя пробелы перед;"%-*.*s", maxlen, maxlen, val
будет выравнивать по левому краю."%-*.*s", padding, str_view.size(), str_view.data()
Вы можете использовать fwrite () в stdout!
fwrite(your_string, sizeof(char), number_of_chars, stdout);
Таким образом вы выведете первые символы (число, определенное в переменной number_of_chars) в файл, в данном случае на стандартный вывод (стандартный вывод, ваш экран)!
printf("%.*s", length, string)
не будет работать.
Это означает, что нужно печатать до байтов длины ИЛИ нулевой байт, в зависимости от того, что наступит раньше. Если ваш массив символов без завершающего нуля содержит нулевые байты ДО длины, printf остановится на них и не продолжит работу.
#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;
}
Я отредактировал код, вот другой способ:
#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
контексте все строки заканчиваются нулем. Массивы char без нуля в них не являются строками ... это массивы char :)