Самый простой способ печати части char [] в C
Скажем, у меня есть char* str = "0123456789"
, и я хочу вырезать первую и последнюю три буквы и печатать только середину, что является самым простым и безопасным способом сделать это?
Теперь трюк: часть для вырезания и часть для печати имеют переменный размер, поэтому я мог бы иметь очень длинный char * или очень маленький.
Ответы
Ответ 1
Вы можете использовать printf()
и строку специального формата:
char *str = "0123456789";
printf("%.6s\n", str + 1);
Точность в спецификаторе преобразования %s
указывает максимальное количество символов для печати. Вы можете использовать переменную, чтобы указать точность во время выполнения:
int length = 6;
char *str = "0123456789";
printf("%.*s\n", length, str + 1);
В этом примере * используется для указания, что следующий аргумент (length
) будет содержать точность преобразования %s
, соответствующий аргумент должен быть int
.
Арифметика указателя может использоваться, чтобы указать начальную позицию, как я сделал выше.
[EDIT]
Еще одна точка, если ваша строка короче, чем спецификатор точности, будут напечатаны меньше символов, например:
int length = 10;
char *str = "0123456789";
printf("%.*s\n", length, str + 5);
Будет напечатан "56789
". Если вы всегда хотите напечатать определенное количество символов, укажите минимальную ширину поля и точность:
printf("%10.10s\n", str + 5);
или
printf("%*.*s\n", length, length, str + 5);
который будет печатать:
" 56789"
Вы можете использовать знак минус для выравнивания по левому краю в поле:
printf("%-10.10s\n", str + 5);
Наконец, минимальная ширина поля и точность могут быть разными, т.е.
printf("%8.5s\n", str);
будет напечатано не более 5 символов, выравниваемых по правому краю в поле с 8 символами.
Ответ 2
Роберт Гэмбл и Стив отдельно имеют большую часть пьес.
Собрано в целом:
void print_substring(const char *str, int skip, int tail)
{
int len = strlen(str);
assert(skip >= 0);
assert(tail >= 0 && tail < len);
assert(len > skip + tail);
printf("%.*s", len - skip - tail, str + skip);
}
Вызов для примера:
print_substring("0123456789", 1, 3);
Ответ 3
Если вы не против изменения данных, вы можете просто сделать некоторую арифметику указателя. Предполагается, что str является указателем char, а не массивом:
char string[] = "0123456789";
char *str = string;
str += 3; // "removes" the first 3 items
str[4] = '\0'; // sets the 5th item to NULL, effectively truncating the string
printf(str); // prints "3456"
Ответ 4
Вот чистая и простая подстрочная функция, которую я выкопал из своей личной библиотеки, которая может быть полезна:
char *
substr(const char *src, size_t start, size_t len)
{
char *dest = malloc(len+1);
if (dest) {
memcpy(dest, src+start, len);
dest[len] = '\0';
}
return dest;
}
Это, вероятно, самоочевидно, но требуется строка, начальная позиция (начиная с нуля) и длина и возвращает подстроку исходной строки или нулевой указатель, если malloc терпит неудачу. Возвращаемый указатель может быть free
'd вызывающим, когда память больше не нужна. В духе C функция не проверяет исходное положение и длину.
Ответ 5
Я считаю, что есть некоторая магия, которую вы можете сделать с printf, который будет печатать только определенное количество символов, но это не принято понимать или использовать. Мы пытались сделать это на предыдущей работе и не могли заставить ее работать последовательно.
Что бы я делал, это сберечь символ, нуль этого символа в строке, распечатать его и сохранить обратно.