Как превратить целые числа в строку в программировании на c? (например, 0 => ноль)

#c

#c

Вопрос:

Как превратить целые числа в строку в программировании на c? (например, 0 => ноль)

Пример кода: https://onlinegdb.com/BygYM1L9V

 #include <stdio.h>
#include <stdbool.h>

int main(int argc, const char * argv[]) {
    int input, number, right_digit;
    bool isNegative = false;

    printf("Insert a number:n ");
    scanf("%d", amp;input);
    // if keyed-in number is negative, make it positive, but remember it was negative
    if ( input < 0 ) {
        input = input;
        isNegative = true;
    }

    if (isNegative == true){
        printf("negative ");
    }
    number = 0;

    // reversing the digits of input and store in number
    while ( input ) {
        // adds the last digit of input to value from right
        number = 10 * number   input % 10;
        input /= 10;
    }

    do {
        right_digit = number % 10;
        switch (right_digit) {
                case 0:
                    printf("zero ");
                    break;
                case 1:
                    printf("one ");
                    break;
                case 2:
                    printf("two ");
                    break;
                case 3:
                    printf("three ");
                    break;
                case 4:
                    printf("four ");
                    break;
                case 5:
                    printf("five ");
                    break;
                case 6:
                    printf("six ");
                    break;
                case 7:
                    printf("seven ");
                    break;
                case 8:
                    printf("eight ");
                    break;
                case 9:
                    printf("nine ");
                    break;
                }
            number = number / 10;
    } while (number != 0 );

    printf("n");
    return 0;
}
 

Ожидаемый результат для ввода 1230 — один два три нуля.

Однако этот код предоставляет 123 и опускает 0. Как мне превратить целые числа в строки?

Однако есть ли лучший способ сделать это? Есть ли какой-либо другой метод? Программисты на C, пожалуйста, помогите

Комментарии:

1. Ваш цикл заканчивается, когда number равен нулю, поэтому он не обрабатывается.

2. Спасибо, как бы вы изменили код, чтобы исправить ошибку?

3. Как вы планируете обрабатывать Insert a number: asdfasdf ?

4. @AndrewHenle это хороший момент. 🙂

5. Мне хочется прочитать число в виде строки и выполнять цикл до тех пор, пока нулевой символ не станет проще, вы могли бы сравнить каждый символ строки с ‘0’ — ‘9’. Если вы хотите остаться с int, вам нужно сначала выяснить, сколько цифр у вас есть.

Ответ №1:

Я бы сбросил переключатель для справочной таблицы. Что касается чисел, которые необходимо анализировать с помощью оператора% «назад» от цифры ls и выше, просто сохраните их цифру за цифрой в отдельном временном массиве, чтобы легко изменить их порядок.

 void stringify (unsigned int n)
{
  const char* LOOKUP_TABLE [10] =
  {
    "zero", "one", "two", "three", "four", 
    "five", "six", "seven", "eight", "nine",
  };

  if(n == 0)
  {
    puts(LOOKUP_TABLE[0]);
    return ;
  }

  int numbers[10]={0}; // assuming UINT_MAX = 4.29 billion = 10 digits

  for(int i=0; i<10; i  )
  {
    numbers[10-i-1] = n%10;
    n/=10;
  }

  bool remove_zeroes = true;
  for(int i=0; i<10; i  )
  {
    if(!remove_zeroes || numbers[i]!=0)
    {
      remove_zeroes = false;
      printf("%s ", LOOKUP_TABLE[numbers[i]]);
    }
  }
}
 

Комментарии:

1. (И как осталось сделать: перепишите это для поддержки отрицательных чисел)

Ответ №2:

Из-за вашей проблемы опечатка в вашем коде: input = input; должно быть input = -input;

Проще работать с числом в виде строки, например :

 #include <stdio.h>

int main() {
  printf("Insert a number:n ");

  char s[32];

  if (fscanf(stdin, "1s", s) != 1) {
    return -1;
  }

  char * p = s;

  if (*p == '-') {
    printf("negative ");
    p  = 1;
  }

  for (;;) {
    switch (*p  ) {
    case 0:
    case 'n':
      if ((*s == '-') amp;amp; (p == (s 2))) {
        puts("missing number");
        return -1;
      }
      putchar('n');
      return 0;
    case '0':
      printf("zero ");
      break;
    case '1':
      printf("one ");
      break;
    case '2':
      printf("two ");
      break;
    case '3':
      printf("three ");
      break;
    case '4':
      printf("four ");
      break;
    case '5':
      printf("five ");
      break;
    case '6':
      printf("six ");
      break;
    case '7':
      printf("seven ");
      break;
    case '8':
      printf("eight ");
      break;
    case '9':
      printf("nine ");
      break;
    default:
      puts(" invalid number");
      return -1;
    }
  }
}
 

Компиляция и выполнение :

 /tmp % gcc -pedantic -Wall -Wextra n.c
vxl15036 /tmp % ./a.out
Insert a number:
 0
zero 
vxl15036 /tmp % ./a.out
Insert a number:
 -1
negative one 
vxl15036 /tmp % ./a.out
Insert a number:
 12305
one two three zero five 
vxl15036 /tmp % ./a.out
Insert a number:
 007
zero zero seven 
vxl15036 /tmp % ./a.out
Insert a number:
 -
negative missing number
vxl15036 /tmp % ./a.out
Insert a number:
 a
 invalid number
 

Как вы видите, число переписывается так, как оно было введено, 0 слева не удаляется, а -0 равен отрицательному нулю


Может быть забавно написать тысячу двести тридцать четыре для 1234 😉

Ответ №3:

Я внес небольшое изменение в вашу программу, чтобы она выполняла цикл один раз, чтобы получить количество цифр, а затем выполняла цикл по count времени для оператора switch .

 #include <stdio.h>
#include <stdbool.h>

int main(int argc, const char * argv[]) {
    int input, number, right_digit;
    bool isNegative = false;

    printf("Insert a number:n ");
    scanf("%d", amp;input);
    // if keyed-in number is negative, make it positive, but remember it was negative
    if ( input < 0 ) {
        input = -input;
        isNegative = true;
    }

    if (isNegative == true){
        printf("negative ");
    }

    int count = 0;
    int n = input;
    //count the digits
        while(n != 0)
    {
        n /= 10;
          count;
    }

    number = 0;

    // reversing the digits of input and store in number
    while ( input ) {
        // adds the last digit of input to value from right
        number = 10 * number   input % 10;
        input /= 10;
    }

    for(int i = 0; i < count; i  ) {
        right_digit = number % 10;
        switch (right_digit) {
                case 0:
                    printf("zero ");
                    break;
                case 1:
                    printf("one ");
                    break;
                case 2:
                    printf("two ");
                    break;
                case 3:
                    printf("three ");
                    break;
                case 4:
                    printf("four ");
                    break;
                case 5:
                    printf("five ");
                    break;
                case 6:
                    printf("six ");
                    break;
                case 7:
                    printf("seven ");
                    break;
                case 8:
                    printf("eight ");
                    break;
                case 9:
                    printf("nine ");
                    break;
                }
            number = number / 10;
    }

    printf("n");
    return 0;
}
 

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

тестовый ввод:

 12345000
 

вывод:

 one two three four five zero zero zero