<stdio.h>
<string.h>
#pragma
warning(disable : 4996)
/*
シングルクォート(')のチェック。
ShiftJISでは全角文字に0x27が含まれることは無いので、全角・半角チェックは不要。
円マーク(\)のチェックだったら、全角・半角のチェックが必要。
引 数:チェックする文字
戻り値:1(シングルクォート)、0(その他文字)
/
int Check0x27(unsigned char c){
if(c == 0x27){
return 1;
}
return 0;
}
/*
シングルクォート(')の文字数カウント。
引 数:シングルクォートの数を数える文字列
戻り値:シングルクォートが含まれる数
/
int Count0x27(const char *str){
int i, cnt = 0;
for(i = 0; str[i] != '\0'; i++){
if(Check0x27(str[i])){
cnt++;
}
}
return cnt;
}
/*
シングルクォートの数が偶数個かのチェック。
引 数:シングルクォートの数を数える文字列
戻り値:1(偶数)、0(奇数)
/
int CheckEven0x27(const char *str){
int count = Count0x27(str);
if(count % 2 == 0){
return 1;
}
return 0;
}
/*
文字列の検索のカスタマイズ版。
指定した文字列の位置のポイントを返すが、その前にシングルクォートが奇数個
ある場合は、その位置を返さず、その後を検索していく。
例)abcdeの場合にcは3
a'bcdeの場合はnull
a'b'cdeの場合は5
/
char* CustomStrStrSQL(const char *alldata, const char *keyword){
char src[4000];
char *ret;
char mae[4000];
int point=0;
strcpy(src, alldata);
while(1){
//検索
ret = strstr(src,keyword);
if(ret != NULL){
//見つかった箇所より前の文字列をセットする
point+= ret - src;
strncpy(mae,alldata,point);
mae[point] = '\0';
if(CheckEven0x27(mae)){
return ret;
}else{
strcpy(src, ret+strlen(keyword));
}
}else{
return NULL;
}
}
}
int main(void){
char str1[100]="AAA AND BBB AND CCC";
char str2[100]="AAA='A' AND BBB AND CCC";
char str3[100]="AAA='BBB' AND CCC";
char str4[100]="AAA='BBB' AND BBB";
printf("1%s:%s\n",str1,CustomStrStrSQL(str1,"AAA"));
printf("2%s:%s\n",str2,CustomStrStrSQL(str2,"AAA"));
printf("3%s:%s\n",str3,CustomStrStrSQL(str3,"aaa"));
printf("4%s:%s\n",str4,CustomStrStrSQL(str4,"BBB"));
//終了待ち
getchar();
return 0;
}
最終更新:2014年05月22日 00:00