C 获取整数输入并逐行输出,无需数组

C 获取整数输入并逐行输出,无需数组,c,loops,for-loop,while-loop,integer-division,C,Loops,For Loop,While Loop,Integer Division,我试图编写一个c程序,当我使用scanf输入一个整数时,将该整数拆分,并逐行打印,而不使用数组。我可以向你们展示我将如何做到这一点 123 / 100 = 1 123 % 100 = 23 23 / 10 = 2 23 % 19 = 3 1 2 3 我知道怎么做,但问题是当我运行此代码时 问题是十行的功率并没有输出正确的值,但若我在循环段中注释第二行的话 # include <stdio.h> # include <string.h> # include <

我试图编写一个c程序,当我使用
scanf
输入一个整数时,将该整数拆分,并逐行打印,而不使用数组。我可以向你们展示我将如何做到这一点

123 / 100 = 1
123 % 100 = 23

23 / 10 = 2
23 % 19 = 3

1
2
3
我知道怎么做,但问题是当我运行此代码时

问题是十行的功率并没有输出正确的值,但若我在循环段中注释第二行的话

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

int main (void)
{
    int no;
    int count, new;
    int newNum = 0;

    printf("Enter an intger number = ");
    scanf("%d", &no);

    newNum = no;
    printf("You entered = %d\n", newNum);

    while(newNum != 0){
        newNum = newNum / 10;
        count++;
    }

    count--;
    count = pow(10, count);

    printf("Power of ten = %d\n", count);

//  while(count != 1){
//      new = no / count;
//      no = no % count;
//      printf("%d\n", new);
//      count = count / 10;
//  }
    return 0;
}
这次十的幂表示正确的值。

我能做些什么来避免这个问题

  • 在不使用数组的情况下,有没有办法做到这一点

在您的代码变量中
count
具有本地范围(自动存储持续时间)

由于堆栈分配,局部作用域变量未初始化

int count=0;
(C99标准)第6.7.8节第10条:

如果没有初始化具有自动存储持续时间的对象 明确地说,它的值是不确定的。

如果没有初始化具有静态存储持续时间的对象 明确地说,那么:

  • 如果有指针类型,则初始化为空指针
  • 如果它有算术类型,则初始化为(正或无符号)零
  • 如果是聚合,则根据这些规则(递归地)初始化每个成员
  • 如果是联合,则根据这些规则(递归)初始化第一个命名成员

注意:您应该避免使用
new
作为变量名称。

对于初学者,您应该小心,不要在计算10的幂时产生溢出

始终测试程序的边界值,例如
INT\u MAX
UINT\u MAX

没有必要使用数学函数

给你

#include <stdio.h>

int main( void ) 
{
    while ( 1 )
    {
        const unsigned int Base = 10;

        printf( "Enter a non-negative number (0 - exit): " );

        unsigned int n;

        if ( scanf( "%u", &n ) != 1 || n == 0 ) break;

        unsigned int divisor = 1; 

        for ( unsigned int tmp = n; !( tmp < Base ); tmp /= Base )
        {
            divisor *= Base;;
        }

        printf( "%u\n", n / divisor );

        for ( ; divisor != 1; divisor /= Base )
        {
            printf( "%u\n", n % divisor / ( divisor / Base ) );
        }

        putchar( '\n' );
    }

    return 0;
}
另一种方法是使用递归函数,如下所示

#include <stdio.h>

void output_digits( unsigned int n )
{
    const unsigned int Base = 10;

    unsigned int digit = n % Base;

    if ( ( n /= Base ) != 0 ) output_digits( n );

    printf( "%u\n", digit );
}

int main( void ) 
{
    while ( 1 )
    {
        printf( "Enter a non-negative number (0 - exit): " );

        unsigned int n;

        if ( scanf( "%u", &n ) != 1 || n == 0 ) break;

        output_digits( n );

        putchar( '\n' );
    }

    return 0;
}
#包括
无效输出\u位(无符号整数n)
{
常量无符号整数基=10;
无符号整数位数=n%基数;
如果((n/=Base)!=0)输出数字(n);
printf(“%u\n”,数字);
}
内部主(空)
{
而(1)
{
printf(“输入一个非负数(0-退出):”;
无符号整数n;
如果(scanf(“%u”,&n)!=1 | n==0)中断;
输出数字(n);
putchar('\n');
}
返回0;
}

您想打印base10数字的每个数字。 可以用这个简单的公式检索位数

int n_digit = (int)log10(x) +1;
要测试它:
(int)log10(99)+1=(int)1.9956+1=2
(int)log10(100)+1=(int)2+1=3

所以你要打印每10次方的商:

for(int i=n_digit-1; i>=0; i--)
{
    // Calc 10^i without pow function
    int num_10_pow_i = 1;
    for(int j=0; j<i; j++)
        num_10_pow_i *=10;

    printf("N[%d]=",i);
    printf("%d\n", (int)(x/num_10_pow_i));
    x = x-((int)(x/num_10_pow_i) * num_10_pow_i);
}
用于(int i=n_位-1;i>=0;i--)
{
//不带pow功能的计算10^i
int num_10_pow_i=1;

对于(int j=0;j,在我的程序中,我将整数变量设置为0,如下所示

int no, a = 0;
int count = 0, new = 0;
int newNum = 0;
在那之后,我的程序运行得很好,但是没有得到完整的输出

while(count != 1){
    new = no / count;
    no = no % count;
    printf("%d\n", new);
    count = count / 10;
}
输出-:

Enter an intger number = 123
You entered = 123
Power of ten = -2147483648
0
0
0
0
0
0
0
0
-5
-9
Floating point exception (core dumped)
Enter an intger number = 123
You entered = 123
Power of ten = 100
Enter an intger number = 123
You entered = 123
Power of ten = 100
1
2
Enter an intger number = 123
You entered = 123
Power of ten = 100
1
2
3
您可以在输出部分看到
3
没有。因为我在while循环外添加了额外的行以获得预期的输出。我添加了以下内容

while(count != 1){
    new = no / count;
    no = no % count;
    printf("%d\n", new);
    count = count / 10;
}
printf("%d\n", no);
输出-:

Enter an intger number = 123
You entered = 123
Power of ten = -2147483648
0
0
0
0
0
0
0
0
-5
-9
Floating point exception (core dumped)
Enter an intger number = 123
You entered = 123
Power of ten = 100
Enter an intger number = 123
You entered = 123
Power of ten = 100
1
2
Enter an intger number = 123
You entered = 123
Power of ten = 100
1
2
3

现在它已经完成。

你做了
count++
,而
count
是未初始化的,并且有一个不确定的值。有没有办法不使用数组来做这件事…?你没有使用数组…你能详细说明一下吗?你为什么要在没有
%
的情况下做这件事?你到底想实现什么,或者确切的目标是什么您试图满足的要求?如果您使用递归,您可以在大约5行代码中完成它(仍然使用
%
)。正如我所说,您可以使用递归。
void p(int I){If(!I)return;p(I/10);printf(“%d\n”,I%10);}
我犯了程序员不会犯的愚蠢错误。是否还有其他代码来完成我的工作。我使用“%”来获得输出。如果没有“%”就可以完成吗?@Kalana我不明白你的意思。你的意思是
%
作为
printf
格式说明符吗?@LPs我想OP意味着模。@Kalana这取决于你对数组的意思。你可以d使用字符串(即使用的数组)和相关函数(如strlen)。无论如何,您的实现是标准的(更快)实现来计算整数的位数。很抱歉打扰您,非常感谢@lpst这是我一直在寻找的答案。非常感谢您分享这一点。我希望两个答案都可以接受,我可以理解,谢谢@G.C.
(int)log10(x)
(以及
pow()
,原因类似)容易出现舍入错误,因此代码会失败。最好避免整数问题的浮点运算。
(int)log10(x)
x==0
时也是一个问题。