Ответ 1
Попробуйте следующее:
int length = 5;
printf("%*.*s", length, length, "hello there");
Есть ли способ распечатать только часть строки?
Например, если у меня есть
char *str = "hello there";
Есть ли способ просто напечатать "hello"
, имея в виду, что подстрока, которую я хочу напечатать, является переменной длиной, а не всегда 5 символами?
Я знаю, что я мог бы использовать цикл for
и putchar
, или что я мог бы скопировать массив, а затем добавить нулевой терминатор, но мне интересно, есть ли более элегантный способ?
Попробуйте следующее:
int length = 5;
printf("%*.*s", length, length, "hello there");
Это тоже будет работать:
fwrite(str, 1, len, stdout);
У него не будет накладных расходов на синтаксический анализ спецификатора формата. Очевидно, чтобы отрегулировать начало подстроки, вы можете просто добавить указатель к указателю.
Вы можете использовать strncpy
, чтобы дублировать часть строки, которую вы хотите распечатать, но вам нужно позаботиться о том, чтобы добавить нулевой ограничитель, поскольку strncpy
не будет делать этого, если он не встречает одно в исходной строке. Лучшее решение, как указал Джерри Коффин, использует соответствующую функцию *printf
для выписывания или копирования нужной подстроки.
В то время как strncpy
может быть опасным в руках кого-то, не используемого для него, это может быть быстрее с точки зрения времени выполнения по сравнению с решением стиля printf
/sprintf
/fprintf
, поскольку нет накладных расходов на обработку строк форматирования. Мое предложение состоит в том, чтобы избежать strncpy
, если можно, но это полезно знать на всякий случай.
size_t len = 5;
char sub[6];
sub[5] = 0;
strncpy(sub, str + 5, len); // char[] to copy to, char[] to copy from(plus offset
// to first character desired), length you want to copy
printf и друзья работают хорошо, когда все, что вы хотите сделать с частичной строкой, но для более общего решения:
char *s2 = s + offset;
char c = s2[length]; // Temporarily save character...
s2[length] = '\0'; // ...that will be replaced by a NULL
f(s2); // Now do whatever you want with the temporarily truncated string
s2[length] = c; // Finally, restore the character that we had saved