Вставка пробелов между цифрами в C
-
21-09-2019 - |
Вопрос
Как бы я взял число вроде 123456
и распечатать его как 1 2 3 4 5 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
РЕДАКТИРОВАТЬ:Спасибо Стиву Джессопу, который предложил правильный алгоритм для положительных целых чисел, пока меня не было.Я изменил описанный выше метод, чтобы правильно распечатать все целые числа (положительные и отрицательные) без последнего пробела.
Обратите внимание, что мы можем избежать проверки отрицательных значений в каждой рекурсии, выполнив проверку только один раз (в основной функции или где-то еще), но я не писал ее, потому что мы потеряем больше в ясности, чем выиграем в производительности.
Другие советы
Самый простой способ сделать это (хотя и не самый быстрый), вероятно, заключался бы в том, чтобы сначала sprintf
число в строковый буфер, а затем циклически пройти по буферу printf
- использование одного символа и одного пробела за раз.
В стандарте нет встроенного способа сделать это. 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 <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;
}
#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;
}