C: Как добавить/объединить пробелы "x" в строку

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

До сих пор я использовал некоторые уродливые способы сделать это:

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

Это один из способов, которым я использовал:

add_spaces(char *dest, int num_of_spaces) {
    int i;
    for (i = 0 ; i < num_of_spaces ; i++) {
        strcat(dest, " ");
    }
}

Это один из лучших в производительности, но также не выглядит стандартным:

add_spaces(char *dest, int num_of_spaces) {
    int i;
    int len = strlen(dest);
    for (i = 0 ; i < num_of_spaces ; i++) {
        dest[len + i] = ' ';
    }
    dest[len + num_of_spaces] = '\0';
}

Итак, у вас есть стандартное решение для меня, поэтому я не изобретаю велосипед?

Ответ 1

Я бы сделал

add_spaces(char *dest, int num_of_spaces) {
    int len = strlen(dest);
    memset( dest+len, ' ', num_of_spaces );   
    dest[len + num_of_spaces] = '\0';
}

Но, как указано в @self, функция, которая также получает максимальный размер dest (включая '\0' в этом примере), более безопасна:

add_spaces(char *dest, int size, int num_of_spaces) {
    int len = strlen(dest);
    // for the check i still assume dest tto contain a valid '\0' terminated string, so len will be smaller than size
    if( len + num_of_spaces >= size ) {
        num_of_spaces = size - len - 1;
    }  
    memset( dest+len, ' ', num_of_spaces );   
    dest[len + num_of_spaces] = '\0';
}

Ответ 2

void add_spaces(char *dest, int num_of_spaces) {
    sprintf(dest, "%s%*s", dest, num_of_spaces, "");
}

Ответ 3

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

Итак, в main предположим, что вы объявили свой массив как char dest[100], затем инициализируйте свою строку спецификациями.

like

char dest[100];
memset( dest,' ',sizeof(dest)); 

Поэтому вам не нужно даже add_spaces(char *dest, int num_of_spaces).