lk里有很多经典的c语言函数,下面就是其中一些
第一个是将char* 类型转换成unsigend long类型
#include <stdlib.h>
#include <stdio.h>
int isdigit(int c)
{
return ((c >= '0') && (c <= '9'));
}
int isxdigit(int c)
{
return isdigit(c) || ((c >= 'a') && (c <= 'f')) || ((c >= 'A') && (c <= 'F'));
}
static int hexval(char c)
{
if (c >= '0' && c <= '9')
return c - '0';
else if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
else if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
return 0;
}
int main(int argc, char *argv[]) {
char *num="200";
int value = 0;
printf("value=%d\n",*num);
printf("value=%c\n",*num);
if (num[0] == '0' && num[1] == 'x') {
// hex
num += 2;
while (*num && isxdigit(*num))
value = value * 16 + hexval(*num++);
} else {
// decimal
while (*num && isdigit(*num))
value = value * 10 + (*num++ - '0');
}
printf("value=%d\n",value);
return 0;
}
第二个是将一行字符串按照空格分开存储
typedef struct {
const char *str;
unsigned int u;
int i;
} cmd_args;
static int tokenize_command(char *buffer, cmd_args *args, int arg_count)
{
int pos;
int arg;
bool finished;
enum {
INITIAL = 0,
IN_SPACE,
IN_TOKEN
} state;
pos = 0;
arg = 0;
state = INITIAL;
finished = false;
for (;;) {
char c = buffer[pos];
if (c == '\0')
finished = true;
// printf("c 0x%hhx state %d arg %d pos %d\n", c, state, arg, pos);
switch (state) {
case INITIAL:
if (isspace(c)) {
state = IN_SPACE;
} else {
state = IN_TOKEN;
args[arg].str = &buffer[pos];
}
break;
case IN_TOKEN:
if (finished) {
arg++;
goto done;
}
if (isspace(c)) {
arg++;
buffer[pos] = 0;
/* are we out of tokens? */
if (arg == arg_count)
goto done;
state = IN_SPACE;
}
pos++;
break;
case IN_SPACE:
if (finished)
goto done;
if (!isspace(c)) {
state = IN_TOKEN;
args[arg].str = &buffer[pos];
}
pos++;
break;
}
}
done:
return arg;
}