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); }