C中的八进制到十进制
我已经修改了一些代码并且具有以下内容。 输出的数字现在更加真实,但仍然不正确(例如,输入54#时输出36应该输出44)
#include #include main() { printf("Please enter an octal number ending with # \n"); int nextNum = getchar(); int number[100]; int numberOfSlots = 0; //Records how many digits are entered int power = 0; //Sets power of 8 during conversion int decimalNumber = 0; int i=0; while(nextNum != '#') //reads in the whole number, putting the characters together to form one Octal number. { if(nextNum >='0' && nextNum 0; i--) { decimalNumber = decimalNumber + (number['i'] * pow(8,power)); power++; } printf("%d", decimalNumber); }
既然这是作业,我会给出一个提示而不是一个答案:
函数getchar()返回一个字符而不是一个数字。 字符具有基于系统字符编码的值(请参阅ASCII )。
查看实际分配给数字的值,并将您从获得的值转换为数值实际应该是什么。
埃里克已经确定了原因。 这是你需要做的
int nextNum= getchar(); if ( nextNum >='0' && nextNum <='9' ) nextNum = nextNum -'0'; number[numberOfSlots] = nextNum;
并在声明时取消初始的getchar()
并在循环内使其成为通用的
在printf("%d", number[numberOfSlots]);
您正在访问尚未初始化的索引(计数器numberOfSlots
已预先递增。)
在printf
之后移动增量或通过printf
numberOfSlots-1
访问元素
以上也是转换循环中的问题,因为numberOfSlots
上的最后一个增量指向number
的最后一个有效元素。
另外,正如Eric J.所说, getchar()
返回字符的整数代码,而不是字符所代表的数字(通常是ASCII值,但它取决于平台)。
decimalNumber = (decimalNumber + (number[numberOfSlots] * (pow(8, power))));
你是通过使用pow()
函数乞讨麻烦。 对于大整数,浮点值将不再保持整数值,并且您将具有舍入错误。 在这种情况下,你不应该混淆使用浮点数学。 您应该使用整数变量。
#include main(){ printf("Please enter an octal number ending with # \n"); int number[21]; int numberOfSlots = 0; int decimalNumber = 0; int nextNum, i; for(nextNum=getchar();nextNum != '#'; nextNum=getchar()){ number[numberOfSlots++] = nextNum - '0'; } for(i=0; i< numberOfSlots ; ++i){ decimalNumber = decimalNumber * 8 + number[i]; } printf("%d", decimalNumber); } /* 17777777777# 2147483647 */ #if 0 #include int main(){ int n, ch; printf("Please enter an octal number ending with # \n"); for(n=0 ; '#' != (ch = getchar()); ){ n = n * 8 + ch - '0'; } printf("%d", n); return 0; } #endif
固定
#include #include main() { printf("Please enter an octal number ending with # \n"); int nextNum = getchar(); int number[100]; int numberOfSlots = 0; //Records how many digits are entered int power = 0; //Sets power of 8 during conversion int decimalNumber = 0; int i=0; while(nextNum != '#') //reads in the whole number, putting the characters together to form one Octal number. { if(nextNum >='0' && nextNum <='9'){ nextNum = (nextNum - '0'); number[numberOfSlots] = nextNum; numberOfSlots++; } else{ printf("Oops! That's not a valid number!"); } nextNum = getchar(); } //Begin converson from Octal to Decimal for(i=numberOfSlots-1; i >= 0; i--) { decimalNumber = decimalNumber + (number[i] * pow(8,power)); power++; } printf("%d", decimalNumber); }