string.h(二)Cの文字列区切り関数strtok()
3803 ワード
char *strtok(char *str1, char *str2);
strtok()は、文字列を個々のセグメントに分割するために使用されます.パラメータsは分割しようとする文字列を指し、パラメータdelimは分割文字列であり、strtok()がパラメータsの文字列にパラメータdelimの分割文字を見つけた場合、その文字は0文字に変更される.1回目の呼び出しではstrtok()にパラメータs文字列(この場合分割子の前の文字列を返す)を与える必要があり、以降の呼び出しではパラメータsをNULL(分割子の後の文字列を返す)に設定します.呼び出しが成功するたびにセグメントが分割されたポインタを返し、分割された列がない場合はNULLを返します.
注意:連続する区切り文字は無視されます
次のプログラムは次のように出力されます.
[abc]
[d]
#include <stdio.h>
#include <string.h>
int main(void){
// ,
char input[]="abc,,d,,";
char *p;
p=strtok(input, ",");
if(p)
printf("[%s]
", p);
p=strtok(NULL, ",");
if(p)
printf("[%s]
", p);
p=strtok(NULL, ",");
if(p)
printf("[%s]
", p);
while(1){}
return 0;
}
例:IP正当性
詳細:
次のインタフェースを実装してください.
boolisIPAddressValid(constchar* pszIPAddr)
入力:pszIPAddr文字列
出力:true有効なIPアドレス、false、無効なIPアドレス
拘束
1.入力IPがXXXである.XXX.XXX.XXX形式
2.文字列の両端にスペースを含む正当なIPとみなす
3.文字列の間にスペースが含まれているのは正当でないと思われるIP
4.01.1に類似する.1.1, 1.02.3.4 IPサブセグメントが0で始まるのは合法的でないIPである
5.サブセグメントが単一である0は正当なIPと考えられ、0.0である.0.0も合法IP
#include "IPAddressValid.h"
#include <stdio.h>
#include <string.h>
#include <string>
//
bool check_token(char *token){
//printf("token[%s]
", token);
if(token==NULL || token=="")
return false;
//0 0
int token_len=strlen(token);
if(token_len>=2 && *token=='0'){
return false;
}
// 0~255
int i=atoi(token);
if(i<0 || i>255)
return false;
return true;
}
bool isIPAddressValid(const char* pszIPAddr)
{
//
if(pszIPAddr==NULL){
return false;
}
char *pszIPAddr2=const_cast<char *>(pszIPAddr);
// pIP[0 ... pIpLen)
int len=strlen(pszIPAddr);
int preBlankNum=0;
int postBlankNum=0;
char *p=NULL;
p=pszIPAddr2;
while(*p==' '){
preBlankNum++;
++p;
}
p=pszIPAddr2+len-1;
while(p>=pszIPAddr2 && *p==' '){
postBlankNum++;
--p;
}
char *pIP=NULL;
int pIpLen=len-preBlankNum-postBlankNum;
pIP=(char *)malloc(sizeof(char)*(pIpLen+1));
for(int i=0;i<pIpLen;i++){
*(pIP+i)=*(pszIPAddr+i+preBlankNum);
}
*(pIP+pIpLen)='\0';
//printf("--->[%s]
", pIP);
if( *pIP=='.' || *(pIP+pIpLen-1)=='.')
return false;
// IP, .
for(int i=0;i<pIpLen;i++){
if( !(*(pIP+i)>='0'&& *(pIP+i)<='9') && !(*(pIP+i)=='.') ){
return false;
}
}
// . split
char *delim=".";
char *token=NULL;
int token_num=0;
token=strtok(pIP, delim);
if(token!=NULL){
token_num++;
bool flag=check_token(token);
if(flag==false)
return false;
}
while(token!=NULL){
token=strtok(NULL, delim);
printf("[%s] ", token);
if(token!=NULL){
token_num++;
bool flag=check_token(token);
if(flag==false)
return false;
}
}
if(token_num!=4)
return false;
return true;
}