最近在看CSAP的网络编程部分,练习题11.2 :编写程序hex2dd.c,将十六进制参数转换为点分十进制并打印结果
例如:输入:$./hex2dd 0x8002c2f2
输出:128.2.194.242
代码如下:
#include <stdio.h>
int ctoi(char ch)
{
    if(ch >= 'a') return (10 + ch -'a');
    return ch - '0';
}
void dex2dd(char *s)
{
    int n, flag = 0;
    char *p;
    p = s + 2;
    while(*p) {
        n = ctoi(*p) * 16 + ctoi(*++p) * 1;
        if(flag > 0) printf(".");
        printf("%d", n);
        p++; flag++;
    }
    printf("\n");
}
int main(int argc,char *argv[])
{
    dex2dd(argv[1]);
    return 0;
}
编译运行:
wu@ubuntu:~/linuxc$ gcc hex2dd.c -o hex2dd
wu@ubuntu:~/linuxc$ ./hex2dd 0x8002c2f2
128.2.194.242
练习题11.3 :与11.2刚好反过来 ,编写程序dd2hex.c,将它点分十进制参数转换为十六进制数并打印结果
例如:输入:$./dd2hex 128.2.194.242
输出:0x8002c2f2
代码如下:
#include <stdio.h>
char a[10];
int ctoi(char ch)
{
    if(ch >= 'a') return (10 + ch -'a');
    return ch - '0';
}
//将十进制的正整数n转换成base进制
void decimal(int n, int base)
{
    int r, i = 0;
    char c;
    if(n < 16) printf("0");
    do {
        r = n % base;
        c = r < 10 ? (r + '0') : ('a' + r - 10);
        a[i++] = c;
        n = n / base;
    } while (n);
    while (i) printf("%c", a[--i]); 
}
void dd2hex(char *s)
{
    char *p, *q;
    int i, n, count;
    n = 0;
    p = q = s;
    printf("0x");
    while(*q && *p) {
        while(*q != '.' && *q) q++;
        count = q - p;
        for(i = 0; i < count; i++) {        
            n = n * 10 + ctoi(*p);
            p++;
        }
        decimal(n, 16);
        if(*q) { 
            q++;
            p = q;
        }
        n = 0;
    }
    printf("\n");
}
int main(int argc,char *argv[])
{
    dd2hex(argv[1]);
    return 0;
}
编译运行:
wu@ubuntu:~/linuxc$ gcc dd2hex.c -o dd2hex
wu@ubuntu:~/linuxc$ ./dd2hex 128.2.194.242
0x8002c2f2


很不错,正好需要
学习了,之前在参加笔试的时候出现过类似的编程题目