我必须做一个程序来取一个数字并逐个打印所有数字作为字符。
我写的代码在这里:
#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更大。 有人可以帮我解决这个问题吗?
谢谢!
答案 0 :(得分:1)
两个问题有两个答案:
Q1)为什么我的例子有错误的数字?
A1)正如其他人所评论的:因为示例号对于使用的数据类型来说太高,它匹配您在低32位中找到的数字:30716370。
Q2)为什么初始检查“&lt; 0”没有触发该示例,但会触发其他更高的示例?
A2)因为30716370小于最大正数,可以用32位有符号int表示,即2147483647 == 0x7FFFFFFF。然而,那个比11111111111122更小(即使在数字位数,但这不是重点)。
30716370&lt;
2147483647&lt;
11111111111122
更高的数字将偶然设置bit31,这使得较低的32位看起来是负的。您可能会发现其他数字太高但看起来并不消极。