#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 搜索问题答案。