アットウィキロゴ

Cのテンポラリ

<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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。