最近在看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
很不错,正好需要
学习了,之前在参加笔试的时候出现过类似的编程题目