Есть ли функция для выравнивания строки с пробелами или специальным символом? [Дубликат]

другое решение состоит в создании нового списка

List<Dog> dogs = new ArrayList<Dog>(); 
List<Animal> animals = new ArrayList<Animal>(dogs);
animals.add(new Cat());
26
задан bobobobo 18 April 2013 в 17:33
поделиться

5 ответов

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

56
ответ дан bobobobo 25 August 2018 в 02:51
поделиться

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

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

-2
ответ дан Dan Olson 25 August 2018 в 02:51
поделиться

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

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);
9
ответ дан Jonathan Leffler 25 August 2018 в 02:51
поделиться

Если вы не возражаете против изменения данных, вы можете просто выполнить некоторую арифметику указателя. Это предполагает, что 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"
1
ответ дан Kyle Cronin 25 August 2018 в 02:51
поделиться

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

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 функция не проверяет исходное положение и длину.

0
ответ дан Robert Gamble 25 August 2018 в 02:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: