Как превратить целые числа в строку в C программирования?(например, 0 => ноль) - PullRequest
0 голосов
/ 18 апреля 2019

Как превратить целые числа в строку в 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", &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 кодеры, помогите пожалуйста

Ответы [ 3 ]

3 голосов
/ 18 апреля 2019

Я бы бросил переключатель для таблицы поиска.Что касается чисел, которые нужно анализировать с помощью оператора% «назад» от цифры 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]]);
    }
  }
}
2 голосов
/ 18 апреля 2019

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

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

#include <stdio.h>

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

  char s[32];

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

  char * p = s;

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

  for (;;) {
    switch (*p++) {
    case 0:
    case '\n':
      if ((*s == '-') && (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; -)

1 голос
/ 18 апреля 2019

Я внес небольшое изменение в вашу программу, так что она проходит один раз, прежде чем получить количество цифр, а затем проходит по 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", &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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...