将数字的数字打印为字符的程序(C语言)

时间:2017-03-19 21:47:45

标签: c

我必须做一个程序来取一个数字并逐个打印所有数字作为字符。

我写的代码在这里:

   #include <stdio.h>
   #include <stdlib.h>
   char digito(int, int);
   int numberofdigits(int);

   int main(void)
{
int num=0, test=0, kdigits=0, k=0;
char ch='\0';
printf("Enter a positive number:\n");
test=scanf("%d", &num);
if (teste!=1 || num<=0)
{
    printf("Error: not a valid number.\n");
    exit(EXIT_FAILURE);
}

kdigits = numberofdigits(num);


for(k=0; k<kdigits; k++)
{
    ch= digito(num, k);
    printf("The digit %d of the number is %c\n", k, ch);
}

return EXIT_SUCCESS;
}


int numberofdigits(int _n)
{
int count=0;
while (_n!=0)
{
    _n/=10;
    count++;
}

return count;
}


char digito(int _number, int _kdigit)
{
int flag=0, digit=0;
char ch='\0';
for (flag=0; flag<=_kdigit; flag++)
{
    digit=_number%10;
    _number/=10;
}

ch= digit + '0';
return ch;
}

现在代码对于相对较小的数字(我想说最多8或9位数)工作得很好。

然后发生了一些奇怪的事情:我试图打印数字11111111111122并获得

数字的数字0是3;

数字的数字1是7;

数字的数字2是3;

数字的数字3是6;

数字的数字4是1;

数字的数字5是7;

数字的数字6是0;

数字的数字7是3;

我想知道为什么?是因为它是一个非常大的数字?因为我尝试了更大的数字,所发生的是程序进入验证scanf读数的初始if子句。那没关系。但问题是程序也应该对这个数字做同样的事情,因为它比最大的int更大。 有人可以帮我解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

两个问题有两个答案:
Q1)为什么我的例子有错误的数字?
A1)正如其他人所评论的:因为示例号对于使用的数据类型来说太高,它匹配您在低32位中找到的数字:30716370。

Q2)为什么初始检查“&lt; 0”没有触发该示例,但会触发其他更高的示例?
A2)因为30716370小于最大正数,可以用32位有符号int表示,即2147483647 == 0x7FFFFFFF。然而,那个比11111111111122更小(即使在数字位数,但这不是重点)。 30716370&lt;
2147483647&lt;
11111111111122
更高的数字将偶然设置bit31,这使得较低的32位看起来是负的。您可能会发现其他数字太高但看起来并不消极。