● 関数リファレンス
文字列の検索
char * __stdcall StrCalc_search_word(char *porg,char *psearch,char *pword,int len);
引数
引数名 | 意味 |
porg | ヌルで終了している文字列を格納したバッファの先頭アドレス |
psearch | 検索開始アドレス |
pword | 末尾ヌルの検索対象文字列 |
len | pword が指す文字列の長さ |
戻り値
発見した文字列の先頭位置を返します。
発見できなかった場合は末尾ヌルの位置を返します。
説明
pword で指定した文字列を psearch から検索します。
porg には、検索するバッファの先頭アドレスを指定し、psearch には検索開始位置を指定します。2つのポインタは同じバッファ内を指している必要があります。また、porg ≦ psearch の関係である必要があります。
pword には検索対象の文字列を指定し、len にはその長さをバイト単位で指定します。長さには末尾ヌル分を含みません。
検索文字列内にある、シングルクォートやダブルクォート、丸括弧で括られた範囲は検索しません。また、シングルクォート、ダブルクォート、丸括弧自体を検索対象とする事はできません。
ダブルクォートの範囲は S-JIS に対応していますが、エスケープシーケンスには対応していません。
次の条件を満たした場合、発見した文字列の先頭位置を返して終了します。
- 現在走査中の位置から続く文字列が pword と一致する事(大文字、小文字の区別はしない)。
- 現在走査中の位置 > porg の場合、検索文字列の前に空白文字、改行文字の何れかがある事。
- 検索文字列の後ろには空白文字、コロン、改行文字、ヌル文字の何れかがある事。
検索はヌル文字が出現するまで続けられます。発見できなかった場合は、末尾ヌルの位置を返し終了します。
例1.
#include <stdio.h>
#include "sc39.h"
void prn(char *ptr,int len) /* 指定文字数分だけ表示 */
{
for(;*ptr && len;ptr++,len--)
putchar(*ptr);
}
void main(void)
{
char *buffer = " 16384 sunday 32768";
char *ptr;
/* "sunday" の検索 */
ptr = StrCalc_search_word(
buffer, /* バッファの先頭 */
buffer, /* 検索開始位置:今回は先頭から */
"sunday",/* 検索対象文字列 */
6); /* 検索対象文字列の長さ */
if (!*ptr){
printf("not found.\n");
return;
}
/* 先頭 〜 sunday の間にある " 16384 " を表示します */
printf("\"");
prn(buffer,ptr - buffer);
printf("\"\n");
}
注意
- 検索バッファにある文字列が StrCalc の計算式である場合、pword が指す文字列と同じ名前の変数が式の中で使用されていると、プログラムからは区別が付かなくなります。
上記の例で、
123 + sunday - 12 sunday 32768
↑
計算式
を検索すると、" 123 + " が結果になってしまいます。
これを避けるために、変数名にはキーワードとなる文字列を使用しないでください。変数登録時の禁止ワードを設定する事も有効です(STRCALC_PARAM 構造体のメンバ ppcheck_paramname 、nametbl_cnt を使用する)。
- 複数種類の検索対象があり、且つ出現順が不明の場合は、次のように全ての種類を検索し、検索開始位置に最も近いポインタを採ります。
例2.
#include <stdio.h>
#include "sc39.h"
void main(void)
{
char *pstr = "A or B and C or D";
char *p1,*p2;
int len1,len2;
p1 = StrCalc_search_word(pstr,pstr,"and",3);
p2 = StrCalc_search_word(pstr,pstr,"or",2);
len1 = p1 - pstr; len2 = p2 - pstr;
if (len1 < len2){ /* "and" が近い位置にある */
printf("%s\n",p1);
}else if (len1 > len2){ /* "or" が近い位置にある */
printf("%s\n",p2);
}else /* 検索対象文字列が見付からない */
printf("null\n");
}