#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