我试图弄清楚我的代码出了什么问题,因为它总是只跳到printf("not an octal number part");
,并且仅输出尽管之前有许多其他计算的结果,但我正在尝试对其进行调试,但似乎无法查找错误。这是下面问题的夏天,也不允许我们使用指针。
一个C语言程序,以字符行的形式输入八进制数并将输入的字符存储在数组中。将八进制数转换为十进制整数,然后使用printf在标准输出上显示十进制整数。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
int main() {
char my_strg[MAX_SIZE];
int c;
int res = 0;
int i = 0;
while ( (c = getchar()) != '\n') {
my_strg[i] = c;
i++;
}
int k = 0;
for(k = strlen(my_strg)-1; k >= 0; k--) {
if((my_strg[k] >= '0') && (my_strg[k] <= '7')) {
res += (pow(8, k) * (my_strg[k]-'0'));
} else if(my_strg[k] == '-') {
res *= -1;
} else {
printf("not an octal number");
break;
}
k++;
}
printf("%d\n", res);
}
您还没有以N结尾的my_strg
。这意味着数组的开头包含输入,但其余部分则包含乱码。进行边界检查也可能是一个好主意,以免缓冲区溢出。
while (((c = getchar()) != '\n') && (i < MAX_SIZE-1)) {
my_strg[i] = c;
my_strg[i+1] = '\0';
i++;
}
非常简单的功能。需要更多错误检查。
static const char digits[] = "0123456789abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRTSTUWXYZ";
long long ALMOST_anybase(const char *str, int base, int *errCode)
{
long long result = 0;
if(str)
{
while(*str)
{
if(*str == '-')
{
result *= -1;
}
else
{
char *ch;
if((ch = strchr(digits, *str)))
{
if(ch - digits >= base)
{
if(errCode) *errCode = 2;
break;
}
result *= base;
result += (ch - digits);
}
else
{
if(errCode) *errCode = 1;
break;
}
}
str++;
}
}
return result;
}
int main(void)
{
printf("%lld\n", ALMOST_anybase("4", 8, NULL));
}