所以我一直在学习 kernighan 和 ritchie 的 C 编程语言 在第二章中,我练习了2.3 htoi函数,将十六进制字符串转换为等效整数值问题。我看到了很多方法来实现这一目标,而不是复制我尝试实现自己版本的解决方案的解决方案。我仍然无法找出最短和最简单的方法来做到这一点,并尝试实现可选的“0x”或“Ox”场景。下面是我的代码
我如何实现可选的“0x”?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
char * reverse(char s[]){
int len = strlen(s);
char *r = (char * ) malloc(len + 1 );;
int k=0;
for(int i = len; i> 0; i--){
r[k] = s[i-1];
k++;
}
r[k] = '\0';
return r;
}
int check_valid(char *s){
int valid = 0;
int not_valid = 0;
int len = strlen(s);
for(int i = 0; i < len;i++){
if((s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'f') ||( s[i] >= 'A' && s[i] <= 'F')){
valid = 1;
}
else
not_valid = 1;
}
if( !not_valid ){
return 1;
}
else
return 0;
}
int rawint(char c ) {
if(isalpha(c)){
return toupper(c) - 'A' + 10;
}
else
return c - '0';
}
int htoi(char *s){
char len = strlen(s);
int power = 1;
int dec = 0;
for (int i = 0; i < len ;i ++){
dec += rawint(s[i]) * power;
power *= 16;
}
return dec;
}
int main(){
char s[] = "7abc";;
int check = check_valid(s);
char * r = reverse(s);
printf("reversed %s\n",r);
if(check){
int dec = htoi(r);
printf("%d\n",dec);
}
else{
printf("not OK");
}
}
实现可选的“0x”或“Ox”场景。
当然,OP 的意思是“实现可选的‘0x’或‘0X’场景”。 (数字
'0'
,不是字母 'O'
)。
我如何实现可选的“0x”?
要检查有效性,请添加前导字符是否与 0x、0X 序列匹配的测试。如果是这样,请跳过 2
char
。
int check_valid(char *s){
// Add
if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) {
s += 2;
}
错误
检查
valid
和 not_valid
,不要将 ""
视为有效。
// if( !not_valid ){
if(valid && !not_valid ){
return 1;
提示:迭代直到找到 null 字符,而不是 2 次向下传递字符串。
//int len = strlen(s);
//for(int i = 0; i < len;i++){
for(int i = 0; s[i]; i++){