//?=1文字strstr
char *wild_strstr(char *str1,char *str2){
int i,j,k;
if(*str2 == '\0')
return str1;
else{
for (i = 0; *(str1+i) != '\0'; i++)
{
if(*(str1+i) == *str2 || *str2 == '?')
{
for (j = i,k = 0;*(str1+j) == *(str2+k)|| *(str2+k) == '?'&& *(str1+j) != ' '; j++,k++);
if(*(str2+k) == '\0') return str1 + i;
}
}
return NULL;
}
}
int WordDel_2(char *setStr,char *inStr,char *outStr){
int inlen,setlen,ni=0,e=0,p=0,supe[MAX],o=0,shiftlen,ex=0,op=0,qei,del=0;
inlen=strlen(inStr);
strcpy(outStr,setStr);
setlen=strlen(setStr);
//空白部分の判定
for (int i = 0; i < setlen; i++)
{
ni = wild_strstr(&setStr[i]," ")-setStr+1;
if(p==ni)
{
}else{
supe[o]=ni;
o++;
p=ni;
}
}
supe[o]=0;//先頭
supe[o+1]=setlen;
qsort(supe,o+2,sizeof(supe[0]),kouzyun);//並び替え
for (int i = 1; i < o+1; i++)
{
qei=supe[i];
if(wild_strstr(&setStr[qei],inStr) != NULL)
{
ni = wild_strstr(&setStr[qei],inStr)-setStr+1;
qei=supe[i-1];
if(ni=='\0'||qei>ni)
{
del++;
}
}
}
//指定文字の削除
while(outStr=wild_strstr(outStr,inStr))
{
shiftlen=strlen(outStr+inlen);
memcpy(outStr,outStr+inlen,shiftlen);
*(outStr+shiftlen)=0;
}
return del;
}
現在、学校の課題でワイルドカードを使ったプログラムの作成に取り組んでいます。
下記の仕様を受け、上記プログラムを作ってみたのですが文字列の一番最後に指定した文字列があった場合、その部分の削除および削除した箇所のカウントがされません。
① 入力する文字は半角英字のみ
② 複数の文字列を空白をはさみ1つの文字列とする。
例) ①AB ②CD ③EF →AB CD EF
③ ①で作った文字列から?を1文字としたワイルドカードを含む文字列を全て削除する。ただし、空白は削除しない。
④ 関数値は削除した箇所を返す。
例) 元の文字列→AB CDED EF 削除する文字列→?D 返す関数値→1