Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用英语显示整数上每个数字的程序不';t处理以“开始的整数”;0“;_C_Loops_Integer - Fatal编程技术网

C 用英语显示整数上每个数字的程序不';t处理以“开始的整数”;0“;

C 用英语显示整数上每个数字的程序不';t处理以“开始的整数”;0“;,c,loops,integer,C,Loops,Integer,我有一个任务,我必须写一个程序,从终端输入一个整数,提取并用英语显示整数的每个数字。我不会使用数组或递归,我们只是从编程开始 例如: “123”返回“一二三” 我的程序运行良好(大部分情况下),但问题是当你在终端中输入类似“0123”的内容时,程序返回“八三”。。。什么 这是我的代码: // Program that takes an integer and displays each digit in English #include <stdio.h> int main (v

我有一个任务,我必须写一个程序,从终端输入一个整数,提取并用英语显示整数的每个数字。我不会使用数组或递归,我们只是从编程开始

例如: “123”返回“一二三”

我的程序运行良好(大部分情况下),但问题是当你在终端中输入类似“0123”的内容时,程序返回“八三”。。。什么

这是我的代码:

// Program that takes an integer and displays each digit in English

#include <stdio.h>

int main (void)
{
    int num, digit;
    int reversed = 0, backupZero = 0;

    printf("Please enter an integer:\n");
    scanf("%i", &num);

    if (num == 0) // In case the input is just "0"
    {
        printf("zero");
    }

    while (num > 0) // Loop to reverse the integer
    {
        digit = num % 10;
        reversed = (reversed * 10) + digit;

        if ((reversed == 0) && (digit == 0)) // If the integer finishes in zero
        {
            ++backupZero; // Use this to add extra zeroes later
        }

        num /= 10;
    }

    while (reversed > 0)
    {
        digit = reversed % 10;
        reversed /= 10;

        switch (digit)
        {
            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:
                printf("zero ");
                break;
        }

    }

    for (int counter = 0; counter < backupZero; ++counter) // Prints the extra zeroes at the end
    {
        printf("zero ");
        --backupZero;
    }

    printf("\n");

    return 0;
}
//采用整数并以英文显示每个数字的程序
#包括
内部主(空)
{
整数,数字;
int reversed=0,backupZero=0;
printf(“请输入一个整数:\n”);
scanf(“%i”和&num);
if(num==0)//如果输入仅为“0”
{
printf(“零”);
}
while(num>0)//循环以反转整数
{
数字=num%10;
反向=(反向*10)+数字;
if((反转==0)&&(数字==0))//如果整数以零结束
{
++backupZero;//稍后使用此选项添加额外的零
}
num/=10;
}
而(反向>0)
{
数字=反向%10;
反向/=10;
开关(数字)
{
案例1:
printf(“一”);
打破
案例2:
printf(“两个”);
打破
案例3:
printf(“三”);
打破
案例4:
printf(“四”);
打破
案例5:
printf(“五”);
打破
案例6:
printf(“六”);
打破
案例7:
printf(“七”);
打破
案例8:
printf(“八”);
打破
案例9:
printf(“九”);
打破
违约:
printf(“零”);
打破
}
}
for(int counter=0;counter

可能是数学方面的问题,我承认我不擅长。

当你用

scanf("%i", &num);
您正在让
scanf
推断数字的基数。以
0
开头,后跟其他数字的数字被解释为八进制。因此
0123
123
不同。事实上,
83

0100 = 64
 020 = 16
  03 =  3
---------
0123 = 83
要读取以10为基数的数字,请使用

scanf("%d", &num);

如果要处理以
'0'
开头的数字,我建议您将用户输入读取为字符串(字符数组),而不是整数

除此之外,您可以使用简单数组将正确的单词映射到每个数字,而不是对每个字符进行“切换”

以下是一种实现方法:

#include <stdio.h>

#define MAX_INPUT_LEN 100

const char* digits[] = {"zero","one","two"  ,"three","four",
                        "five","six","seven","eight","nine"};

int main()
{
    int i;
    char format[10];
    char str[MAX_INPUT_LEN+1];
    sprintf(format,"%c%us",'%',MAX_INPUT_LEN); // now format = "%100s"
    scanf(format,str); // will write into str at most 100 characters
    for (i=0; str[i]!=0; i++)
    {
        if ('0' <= str[i] && str[i] <= '9')
            printf("%s ",digits[str[i]-'0']);
        else
            printf("invalid character ");
    }
    return 0;
}
#包括
#定义最大输入长度100
常量字符*数字[]={“零”、“一”、“二”、“三”、“四”,
“五”、“六”、“七”、“八”、“九”};
int main()
{
int i;
字符格式[10];
char str[最大输入长度+1];
sprintf(格式,“%c%us”、“%”,最大输入长度);//现在格式=“%100s”
scanf(format,str);//将最多写入str 100个字符
对于(i=0;str[i]!=0;i++)
{

如果('0'哦,哇。我花了3到4个小时写了下面的代码。我才进入第一周,所以请考虑一下。 更新:增加了工作减+一些评论

#include <stdio.h>
#include <math.h>

int main(void)

{
    int num, count, user, out;
    count = 0;

    printf("Type in any int: ");
    scanf("%d", &num);

    // adding minus to the beginning if int is negative
    if (num < 0) 
    {
        num = -num;
        printf("minus ");
    }
    user = num;

    // creating a power to the future number
    while (num != 0)
    {
       num = num / 10;
       count++;
    }

    int i2;
    i2 = count;

    // main calculations: dividing by (10 to the power of counter) and subtracting from the initial number
    for (int i = 0; i < i2; i++)
    {
        out = user / pow(10, count - 1);
        user = user - out * pow(10, count - 1);
        count--;

        switch (out)
        {
            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;
            case 0:
                printf("zero ");
                break;
            default:
                break;
         }
    }
    printf("\n");

    return 0;
}
#包括
#包括
内部主(空)
{
int num、count、user、out;
计数=0;
printf(“输入任意整数:”);
scanf(“%d”和&num);
//如果int为负数,则在开头加负数
if(num<0)
{
num=-num;
printf(“减”);
}
用户=num;
//创造未来数字的力量
while(num!=0)
{
num=num/10;
计数++;
}
int i2;
i2=计数;
//主要计算:除以(10为计数器的幂)并从初始数字中减去
对于(int i=0;i
有一些错误:

if ((reversed == 0) && (digit == 0)) (incorrect)
if ((reversed == 0) || (digit == 0)) (correct)
在最后一个循环中,您应该删除

--backupZero;

代码可以更好地读取数字

这是“%i”的属性,它也可以处理其他基数。对于“%d”,0123是123,因为%d代表十进制到整数的转换。哦,我明白了!它太简单了,非常感谢您的评论!我会记住这一点:).0123本身不是八进制;它仅在%i的上下文中是八进制,或者在C.atoi中是整数文本(“0123”);不会那样做的。@juanchopanza我们曾就此进行过一次讲座,但我完全忘记了,非常感谢,你的回答非常有用!我需要记住%I和%d的区别。哦,我相信这是一种更有效的方法,但