标签:
一、实验目的: 1、 熟悉相关编程函数的功能、用法与特性。 2、 熟练运用地址转换函数及清楚转换前后IP地址格式的变化。 |
二、实验内容 理解程序同时写出程序输出内容含义。
|
三、代码设计 字符串copy: #include<stdio.h> #include<string.h> main() { char a[30]="string(1)"; char b[]="string(2)"; printf("before strcpy() :%s\n",a); printf("after strcpy() :%s\n",strcpy(a,b)); }
内存和字符串copy命令比较: #include<stdio.h> #include<string.h> main() { char a[30]="string (a)"; char b[30]="string1\0string"; int i; strcpy(a,b); printf("strcpy():%s",a); printf("\nstrcpy():"); for(i=0;i<30;i++) printf("%c",a[i]); memcpy(a,b,30); printf("\nmemcpy() :"); for(i=0;i<30;i++) printf("%c",a[i]); printf("\n"); return; }
IP地址转换: #include<stdio.h> #include<string.h> #include<netinet/in.h> #include<arpa/inet.h> int main(int argc,char* argv[]) { struct in_addr addr1,addr2; unsigned long l1,l2; char *p1,*p2; int i; l1=inet_addr("192.168.0.74"); l2=inet_addr("211.100.21.179"); printf("%u\n",l1); for(i=0;i<4;i++) { printf("%02x",*((unsigned char*)(&l1)+i)); } printf("\n"); printf("%u \n",l2); for(i=0;i<4;i++) { printf("%02x",*((unsigned char*)(&l2)+i)); } printf("\n"); memcpy(&addr1,&l1,4); memcpy(&addr2,&l2,4); printf("%s\n",inet_ntoa(addr1)); printf("%s\n",inet_ntoa(addr2)); p1=inet_ntoa(addr1); p2=inet_ntoa(addr2); printf("%s \n",p1); printf("%s \n",p2); return 0; }
|
四、实验分析与总结 结果1:
利用strcpy()函数将b字符串拷贝到a数组中,返回结果为拷贝后的结果。输出的第一行是拷贝之前的原数组a,第二行是拷贝之后的a数组,被b数组完全覆盖了。
结果2:
利用memcpy()函数同样实现拷贝功能,a是拷贝的位置,b是拷贝的位置,30是长度。’\0’即结束。输出的第一行输出的是用strcpy()函数拷贝后的a数组——被b数组全部覆盖了,a数组的长度不变。第二行是for循环中\0不输出,并不结束。第三行是输出mencpy()函数将b数组函数完全拷贝到a数组,a数组的长度会变成b数组,所以拷贝的是全部的b数组。 结果3:
inet_addr函数将字符串形式的IP地址转换成32位二进制值的IP地址。memcpy 函数将存放在l1,l2中的32位二进制IP地址存放到addr1,addr2中并输出。inet_ntoa函数将32位网络字节序的二进制IP地址转换成相应的点分十进制的IP地址。第一行和第三行是输出了经过inet_addr函数转换后的二进制值以无符号的形式输出。第二行和第四行是将二进制值强制转换成无符号数,再以2位的十六进制输出。第五行和第六行再用inet_ntoa函数将地址转换成十进制地址并输出。第七行和第八行输出与第六行一样,是因为返回值所指向的字符串还留在静态内存中,函数是不可重入的,所以输出还是原来的那样。
|
标签:
原文地址:http://www.cnblogs.com/elewei/p/4765769.html