#include <iostream> #include <string> using namespace std; int ip[32]={0};//可以只写一个0,不然的话就是随见的如-3895567 之类的。 int * intToA(int a){ //把整型变成二进制数组。 int *p =new int [8]; //这种写法不好,在哪new 的在哪释放。C++有智能指针,帮你释放内存。 for(int j=0;j<8;j++){ p[j]=0; } int k=7; while((a>>1)>0&&k>=0){//a>>1 替换了a/2。 //p[k--]=a%2;//求余操作是很耗资源的如何避免。 if ((a&1)==0) { //a&1 一定要()括号括起来。 p[k]=0; }else{ p[k]=1; } a=a>>1;//避免了a/=2; k--; } if ((a&1)==0) { //p[k]=a%2;的高效写法。这值得注意。 p[k]=0; }else{ p[k]=1; } return p; } int power(int n,int m){ //指数函数 if (n==0) { return -1; } if (m==0) { return 1; } int result=1; for(int i=0;i<m;i++){ result*=n; } return result; } string * ipSplit(string str){ //ip 特定的split 写法。 string *str1=new string [4]; int j=0; string temp=""; for(int i=0;i<str.length();i++){ if (str[i]=='.') { str1[j]=temp; j++; temp=""; }else{ temp+=str[i]; } } str1[j]=temp;//这个必须有。 return str1; } int main(int argc, char* argv[]) { string ipstr="192.168.0.1"; string *strs =ipSplit(ipstr); int * ints =new int [4]; int intLen=4; for(int i=0;i<intLen;i++){ ints[i]=0; char *p=&strs[i][0];//怎么让一个char 型指向一个string型。就是让char 指针指向string 第一个字符 strs[i]是字符,第一个字符为strs[i][0]; int k=0; int strsLen=strs[i].length(); for(int j=strsLen-1;j>=0;j--){ ints[i]+=(char((*p)-'0')*power(10,strsLen-1-k));//char型变成int 型 char((*p)-'0'); k++; p++; } } int *p; for(int j=0;j<4;j++){//4个8为二进制数组转换为32位数组。 p=intToA(ints[j]); for(int n=0;n<8;n++){ ip[j*8+n]=p[n]; } } cout<<"\nip[k]:"<<endl; for(int k=0;k<32;k++){ if (k!=0&&k%8==0) { cout<<" "; } cout<<ip[k]<<" "; } cout<<endl; return 0; }
心得:
1. 其中一些高效写法值得注意。
2. char 怎么指向string 类型。
3. string 类型有length 函数 但char [] 字符数组没有strlen(const char[]) 只能用char [] 做参数,不能用string 作为strlen()参数。
4. c++ 里没有数组没有任何函数。即不能.()的。
5. 多用英文在google 搜索问题答案。