Распечатать часть строки в C - PullRequest
12 голосов
/ 30 января 2011

Можно ли печатать только часть строки?

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

char *str = "hello there";

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

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

Ответы [ 4 ]

30 голосов
/ 30 января 2011

Попробуйте это:

int length = 5;
printf("%*.*s", length, length, "hello there");
16 голосов
/ 30 января 2011

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

fwrite(str, 1, len, stdout);

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

1 голос
/ 30 января 2011

Вы можете использовать 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
0 голосов
/ 30 января 2011

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
...