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

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

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

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

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

     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 : Спасибо Стив Джессоп, который предложил правильный алгоритм для целых положительных чисел, пока я отсутствовал. Я изменил приведенный выше метод, чтобы правильно распечатать для всех int (положительных и отрицательных), без последнего пробела.

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

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

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

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

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

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

     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'); 
     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++]); 

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

     #include  #include  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; } 
     #include  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; }