Подтвердить что ты не робот

Печатать часть строки в C

Есть ли способ распечатать только часть строки?

Например, если у меня есть

char *str = "hello there";

Есть ли способ просто напечатать "hello", имея в виду, что подстрока, которую я хочу напечатать, является переменной длиной, а не всегда 5 символами?

Я знаю, что я мог бы использовать цикл for и putchar, или что я мог бы скопировать массив, а затем добавить нулевой терминатор, но мне интересно, есть ли более элегантный способ?

4b9b3361

Ответ 1

Попробуйте следующее:

int length = 5;
printf("%*.*s", length, length, "hello there");

Ответ 2

Это тоже будет работать:

fwrite(str, 1, len, stdout);

У него не будет накладных расходов на синтаксический анализ спецификатора формата. Очевидно, чтобы отрегулировать начало подстроки, вы можете просто добавить указатель к указателю.

Ответ 3

Вы можете использовать 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

Ответ 4

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