目标
- 字符串转为数字
- 字符转小写
- 字符转大写
- 字符是数字
- char 转 int 可能为负数
将字符串转为数字:
int toInteger(char[] s) {
int n = 0;
for (int i = 0; s[i] >= '0' && s[i] <= '9'; i++) {
n = 10 * n + (s[i] - '0');
}
return n;
}
失误点:
- 习惯性调用 s.length 控制循环次数,得到每个 char,判断是否是数字。
字符转大小写:
int lower(char c) {
if (c >= 'A' && c <= 'Z') {
return c - ('A' - 'a');
}
return c;
}
int upper(char c) {
if (c >= 'a' && c <= 'z') {
return c + ('A' - 'a');
}
return c;
}
字符是数字:
int isDigit(char c) {
return c >= '0' && c <= '9';
}
char 转 int 可能为负数?
char c = 128;
int i = c;
printf("%d", i);// -128
看来本机是根据 char 的最高位,扩展至 int 类型的。i 是正是负,取决于 c 的最高位是 0 还是 1。
将字符串转为十六进制整数:
int toHex(char s[]) {
int i = 0;
int n = 0;
int f;
if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) {
i = 2;
}
for (; f = isHex(s[i]); i++) {
int d;
if (f == 1) {
d = s[i] - '0';
} else if (f == 2) {
d = 10 + (s[i] - 'a');
} else if (f == 3) {
d = 10 + (s[i] - 'A');
}
n = 16 * n + d;
}
return n;
}
int isHex(char d) {
if (d >= '0' && d <= '9') {
return 1;
} else if (d >= 'a' && d <= 'f') {
return 2;
} else if (d >= 'A' && d <= 'F') {
return 3;
} else {
return 0;
}
}
失误点:
- s[i] - ‘a’ 忘了加十。