百納の筆記試験問題はip文字列を32ビットのバイナリ数に変換します


#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<<"
ip[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で質問の答えを多く検索します.