从C中的整数中提取数字?

从C中的整数中提取数字?,c,integer-division,C,Integer Division,此函数用于垂直打印num中的数字,但是当我运行它时,它只打印0。我知道它得到了正确的位数,因为它打印的零数与数字中的数字数相同,所以我在这里使用模或除法肯定有问题,我似乎找不到它。任何帮助都将不胜感激,谢谢 获取数字的函数(问题可能在这里?): void getNum() { int num,数字=0; printf(“输入要垂直打印的数字:”); scanf(“%d”和&num); if(num0){ 最小值=打印(数字/10,数字-1); 如果(数量%10) printf(“%s%d\

此函数用于垂直打印
num
中的数字,但是当我运行它时,它只打印0。我知道它得到了正确的位数,因为它打印的零数与数字中的数字数相同,所以我在这里使用模或除法肯定有问题,我似乎找不到它。任何帮助都将不胜感激,谢谢

获取数字的函数(问题可能在这里?):

void getNum()
{   
int num,数字=0;
printf(“输入要垂直打印的数字:”);
scanf(“%d”和&num);
if(num<0)
{
数字=1;
}
while(num)
{
num=num/10;//问题出在这里。当我将num传递给print()时,num为0
digits++;//只需添加一个新变量即可修复。谢谢大家!
}
打印(数字、位数);
}

我看不出你的代码有什么问题,只是太复杂了,不必要地使用浮点数学

这里有一个替代方案:

void getNum()
{   
    int num, digits=0;
    printf("Enter a number to be printed vertically: ");
    scanf("%d", &num);

    if(num < 0)
    {
        digits = 1;
    }
    while(num)
    {
        num = num/10; //Here was the problem. Num was 0 once i passed it to print()
        digits++; //Simply added a new variable to fix it. Thanks all!
    }

    print(num, digits);
}

诀窍是在递归调用之后移动打印。这允许更简单的逻辑。

这是我问题的解决方案。在将其传递给函数之前,我将
num
设置为
0
。我只是声明了另一个变量
num1
,以在while循环中使用,而不是传递给函数的实际
num

代码

通过对代码的一点小小的更改,我得到了一个代码版本,该版本消除了
数字
参数,并且适用于负数


代码


现在如果我们调用
print()


输出

int number = INT_MIN;// a negative number

print(-120);
printf("\n");
print(-321);

print(number);
[Edit3]

将代码更改为也适用于
打印(0)

int zeroSignal=1;
无效打印(整数)
{
#如果INT_最小值<-INT_最大值
///二者相辅相成。
///处理特殊情况
如果(num==INT\u MIN){
///fprintf(stderr,“休斯顿,我们有个问题”\n);
//可能在这里返回或退出。
//~ 2147483647 -> 2147483648
打印(整数最大值/10);
打印(INT_MIN%10);//便携式版本///打印(8);
返回;
}
如果(num<0){
//num=-((无符号)num);
num*=-1;
}
#恩迪夫
if(num==0&&zeroSignal){
printf(“只有零:%d\n”,0);
}
如果(数值>0){
零信号=0;
打印(个/10);
printf(“%d\n”,数量%10);
}
零信号=1;
}
在上面的代码中,我使用全局整数
zeroSignal
实现了一种适用于
print(0)

int-print(int-num,int-digits)的方法
{
int min=0;
如果(数字>0){
最小值=打印(数字/10,数字-1);
如果(数量%10)
printf(“%s%d\n”,num<0&&!(min++)?“-”:“”,abs(num%10));
}
返回最小值;
}
int print1(int num,int位数)
{
int min=0;
如果(数字>0){
最小值=打印1(数字/10,数字-1);
如果(数量%10)
{
printf(“%s”,num<0&&!(min++?“-\n”:”);
printf(“%u\n”,abs(num%10));
}
}
返回最小值;
}
int main()
{
印刷品(-1234,9);
printf(“\n-------------\n\n”);
打印1(-23456565,9);
}

适合我。您的输入是什么?
pow()
可能返回一个刚好低于预期整数值的值。最好对结果进行四舍五入
四舍五入(pow(10位数字))在截断为
int
之前。请确保首先
#包括
我只需输入任意长度的随机数,并始终得到所有0,与位数相同的数字。也许我刚才添加的函数就是错误所在。(获取数字)嗯,看着它,我意识到我是多么愚蠢。在将num传递给函数之前,我将num设置为0。我道歉!当
num<0
时,这有一个有趣的输出。但是OP也是。我复制粘贴到我的代码中,仍然奇怪地得到了所有0…我编辑了上面的内容以添加我的getNum函数,也许问题就在那里?@abzib:是的,问题就在那里。您修改
num
直到它变为零,然后对其新的零值调用print。@chux,可能不重要,但在开始时添加此条件以解决此问题<代码>如果(num@chux“RealStimeMeNICA,OK。我想现在它处理了<代码> -In MultMIN <代码> > <代码>打印(8);假定代码> InthMI==-2147483648 < /COD>。假设不需要也不可移植编程。请考虑<代码>打印(In Min % 10);<代码> >删除<代码> fPrtuf(STDRR,…< /代码>)。
void print(int num, int digits)
{
    if (digits > 0) {
        print(num / 10, digits - 1);
        printf("%d\n", num % 10);
    }
}
void getNum()
{   

    int num, num1, digits=0;
    //get the num
    printf("Enter a number to be printed vertically: ");
    scanf("%d", &num);
    num1 = num;

    //Loop to find how many digits are in the number
    while(num1)
    {
        num1 = num1/10;
        digits++;
    }
    //call function to print
    print(num, digits);
}
void print(int num)
{
    if (num < 0){
        num *=-1; 
    }

    if (num > 0) {
        print(num / 10);
        printf("%d\n", num % 10);
    }
}
void print(int num)
{

    #if INT_MIN < -INT_MAX
    ///In two's complements systems.
    ///handle special case

    if ( num == INT_MIN ) {
      //fprintf(stderr, "Houston, we have a problem\n");

      // Maybe return or exit here.
      //~ 2147483647 -> 2147483648
      print(INT_MAX/10);
      print(INT_MIN%10); //portable version ///print(8);
      return;
    }

    if (num < 0){   
            //num =-((unsigned)num);
            num *=-1; 
    }

    #endif  

    if (num > 0) {
        print(num / 10);      
        printf("%d\n",  num%10);
    }

}
int number = INT_MIN;// a negative number

print(-120);
printf("\n");
print(-321);

print(number);
1
2
0

3
2
1
Houston, we have a problem
int zeroSignal=1;

void print(int num)
{

    #if INT_MIN < -INT_MAX
    ///In two's complements systems.
    ///handle special case

    if ( num == INT_MIN ) {
      ///fprintf(stderr, "Houston, we have a problem\n");
      // Maybe return or exit here.
      //~ 2147483647 -> 2147483648
      print(INT_MAX/10);
      print(INT_MIN%10); //portable version ///print(8);
      return;
    }

    if (num < 0){   
            //num =-((unsigned)num);
            num *=-1; 
    }

    #endif  


    if (num==0 && zeroSignal){
        printf("Only zero: %d\n", 0);
    }

    if (num > 0) {
        zeroSignal = 0;
        print(num / 10);
        printf("%d\n",  num%10);
    }

    zeroSignal = 1;      
}
int print(int num, int digits)
{
    int min = 0;
    if (digits > 0) {
        min = print(num / 10, digits - 1);
        if(num %10)
           printf("%s%d\n", num < 0 && !(min++) ? "-" : "", abs(num % 10));
    }
    return min;
}

int print1(int num, int digits)
{
    int min = 0;
    if (digits > 0) {
        min = print1(num / 10, digits - 1);
        if(num %10)
        {
            printf("%s", num < 0 && !(min++) ? "-\n" : "");
            printf("%u\n", abs(num % 10));
        }
    }
    return min;
}

int main()
{
    print(-1234, 9);
    printf("\n-------------\n\n");
    print1(-23456565, 9);
}