Самый простой способ напечатать часть символа[] в C

StackOverflow https://stackoverflow.com/questions/256218

  •  05-07-2019
  •  | 
  •  

Вопрос

Допустим, у меня есть char* str = "0123456789" и я хочу вырезать первую и последние три буквы и напечатать только середину, какой самый простой и безопасный способ сделать это?

Теперь в чем фокус:Часть для вырезания и часть для печати имеют разный размер, поэтому у меня мог бы получиться очень длинный символ * или очень маленький.

Это было полезно?

Решение

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

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

[ПРАВИТЬ]

Еще один момент: если ваша строка короче вашего спецификатора точности, будет напечатано меньше символов, например:

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 символов.

Другие советы

Роберт Гэмбл и Стив по отдельности имеют большинство произведений. Собран в одно целое:

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);

Если вы не возражаете против изменения данных, вы можете просто сделать некоторую арифметику с указателями. Предполагается, что str является указателем на символ, а не массивом:

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"

Вот простая и понятная функция подстроки, которую я нашел в моей личной библиотеке:

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 для вызывающей стороны, когда память больше не нужна. В духе C, функция не проверяет начальную позицию и предоставленную длину.

Я полагаю, что есть некоторая магия, которую вы можете сделать с помощью printf, которая будет печатать только определенное количество символов, но она обычно не понимается и не используется. Мы пытались сделать это на предыдущей работе и не могли заставить ее работать последовательно.

Что я хотел бы сделать, это сохранить символ, обнулить этот символ в строке, распечатать его, а затем сохранить его обратно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top