我正在尝试用 C 语言编写一个将十六进制数转换为整数的程序。我已经成功编写了一个将八进制转换为整数的程序。但是,一旦我开始使用字母 (af),问题就开始了。我对该程序的想法是广告如下:
参数必须是一个以 0x 或 0X 开头的字符串。
参数十六进制数存储在 char 字符串 s[] 中。
整数 n 被初始化为 0,然后按照规则进行转换。
我的代码如下(我只阅读了 K & R 的 p37,所以对指针不太了解):
/*Write a function htoi(s), which converts a string of hexadecimal digits (including an optional 0x or 0X) into its equivalent integer value. The allowable digits are 0 through 9, a through f, and A through F.*/
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
int htoi(const char s[]) { //why do I need this to be constant??
int i;
int n = 0;
int l = strlen(s);
while (s[i] != '\0') {
if ((s[0] == '0' && s[1] == 'X') || (s[0] == '0' && s[1] == 'x')) {
for (i = 2; i < (l - 1); ++i) {
if (isdigit(s[i])) {
n += (s[i] - '0') * pow(16, l - i - 1);
} else if ((s[i] == 'a') || (s[i] == 'A')) {
n += 10 * pow(16, l - i - 1);
} else if ((s[i] == 'b') || (s[i] == 'B')) {
n += 11 * pow(16, l - i - 1);
} else if ((s[i] == 'c') || (s[i] == 'C')) {
n += 12 * pow(16, l - i - 1);
} else if ((s[i] == 'd') || (s[i] == 'D')) {
n += 13 * pow(16, l - i - 1);
} else if ((s[i] == 'e') || (s[i] == 'E')) {
n += 14 * pow(16, l - i - 1);
} else if ((s[i] == 'f') || (s[i] == 'F')) {
n += 15 * pow(16, l - i - 1);
} else {
;
}
}
}
}
return n;
}
int main(void) {
int a = htoi("0x66");
printf("%d\n", a);
int b = htoi("0x5A55");
printf("%d\n", b);
int c = htoi("0x1CA");
printf("%d\n", c);
int d = htoi("0x1ca");
printf("%d\n", d);
}
我的问题是:
1. 如果我在 htoi(s) 的参数中不使用 const,我会从 g++ 编译器收到以下警告:
2-3.c:在函数“int main()”中:2-3.c:93:20:警告:不推荐将字符串常量转换为“char*”[-Wwrite-strings] 2-3.c:97 :22: 警告:不推荐从字符串常量转换为 'char*' [-Wwrite-strings] 2-3.c:101:21:警告:不推荐从字符串常量转换为 'char*' [-Wwrite-strings] 2 -3.c:105:21:警告:不推荐将字符串常量转换为 'char*' [-Wwrite-strings]
为什么是这样?
2.为什么我的程序需要这么长时间才能运行?我还没有看到结果。
3.为什么我在终端输入 cc 2-3.c 而不是 g++ 2-3.c 时,会出现以下错误信息:
“未定义对‘pow’的引用”
在我使用过电源功能的每一行上?
4. 请指出我的程序中的其他错误/潜在改进。