Вставка пробелов между цифрами в C - PullRequest
4 голосов
/ 18 января 2010

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

Ответы [ 7 ]

10 голосов
/ 18 января 2010

Простейшим способом сделать это (хотя и не самым быстрым), вероятно, будет сначала sprintf число в строковом буфере, а затем перебрать буфер printf - один символ и один пробел за раз.

Нет встроенного способа сделать это в стандартном printf форматировании.

7 голосов
/ 18 января 2010

Как упомянул в своем комментарии «jamesdlin», подход 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

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

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

2 голосов
/ 18 января 2010

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 января 2010

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

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 */

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

0 голосов
/ 11 октября 2018
#include <stdio.h>
int main ()
{
    int a, b, c, d, e;
    printf("Write a number of four figures\n");
    scanf("%d", &a);
    printf("Your number is:\n");

    b = (a - (a % 1000)) / 1000;
    c = ((a - (a % 100)) / 100) - b * 10;
    d = ((a - (a % 10)) / 10) - b * 100 - c * 10;
    e = (a - b * 1000 - c * 100 - d * 10);

    printf("%d\t%d\t", b, c);
    printf("%d\t", d);
    printf("%d", e);

    return 0;
}
0 голосов
/ 18 января 2010

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

#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 января 2010
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++]);
...