Вставление пробелов между цифрами в C

Как я пошел бы о взятии числа как 123456 и наличие его печатает как 1 2 3 4 5 6?

5
задан John Carter 18 January 2010 в 13:02
поделиться

6 ответов

Как упомянул в его комментарии «Джеймсдлин», подход GMan будет работать, однако вам нужно будет хранить его в буфере, чтобы распечатать в правильном порядке (его алгоритм будет распечатать «6 5 4 3 2 1» для ввода 123456). На данный момент я бы сказал, что было бы намного проще просто использовать SprintF, как «Там в нем», предложенном в своем ответе (если это не является назначением класса алгоритма).

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

Рекурсивная реализация очень проста:

void PrintfRecursivly(int number)
{
     if (number < 0) 
     {
       number *= -1;
       printf("- ");           
     }
     if (number > 10) 
     {
        PrintfRecursivly(number / 10);
        printf(" ");
     }

     printf("%d", number % 10);     
}

int main()
{
   int number = -78900456;
   PrintfRecursivly(number);

   return 0;
}

Вход:

-78900456

Выход:

 - 7 8 9 0 0 4 5 6 

Редактировать : Благодаря Стиву Джессопу, Кто Предложил правильный алгоритм для позитивных целых чисел, пока я отсутствовал. Я изменил вышеуказанный способ, чтобы правильно распечатать для всех ints (положительных и отрицательных), без последнего пространства.

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

7
ответ дан 18 December 2019 в 07:30
поделиться

Самый простой способ сделать это (хотя и не самый быстрый), вероятно, будет первым Sprintf число в строку буфера, а затем цикл через буфер PrintF -я на один символ и одно пространство за раз.

Там нет встроенного способа сделать это в стандартном PrintF Форматирование.

10
ответ дан 18 December 2019 в 07:30
поделиться

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

int d; // your number

/* While `d` is not zero */
/* Modulus `d` with 10 to extract the last digit */
/* Print it, with your space */
/* Divide by 10 to remove the last digit */
/* Repeat */

Это будет задом наперёд. Я оставлю это как упражнение, чтобы вы исправили это. (Подсказка: в цикле поместите результат в массив символов, а когда закончите, начните с последнего индекса массива и распечатайте задом наперёд)

.
2
ответ дан 18 December 2019 в 07:30
поделиться

char buffer[50];
int myNum = 123456;
int n;
int i;

n = snprintf(buffer, sizeof buffer, "%d", myNum);

for (i = 0; i < n; i++)
{
    putchar(buffer[i]);
    putchar(' ');
}

putchar('\n');
2
ответ дан 18 December 2019 в 07:30
поделиться
int number = 123456;
char strNumber[64];
strNumber[0] = '\0';
sprintf_s(strNumber, "%d", number);
int i = 0;
while(strNumber[i] != '\0')
    printf("%c ", strNumber[i++]);
0
ответ дан 18 December 2019 в 07:30
поделиться

Это только работает только для целых чисел без знака:

#include <stdio.h>
#include <math.h>

void print_number(unsigned int number) {
    int n = number, c = 0, p;
    while (n > 0) {
        n /= 10;
        c++;
    }
    for (n = c - 1; n >= 0; n--) {
        p = pow(10, n);
        printf("%d ", number / p);
        number -= number / p * p;
    }
    printf("\n");
}


int main(int argc, char *argv[]) {
    print_number(1);
    print_number(12);
    print_number(123);
    print_number(1234);
    print_number(12345);
    print_number(1234567);
    print_number(12345678);
    print_number(123456789);
    return 0;
}
0
ответ дан 18 December 2019 в 07:30
поделиться
Другие вопросы по тегам:

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