|
> この%%100,カテゴリ1%%の %%100,が何文字め(何バイトめ)から何文字め(何バイトめ)までか
> 終わりの%%が何文字め(何バイトめ)から何文字め(何バイトめ)までかを知りたい時には、
1バイトずつ文字列を見ていっているのだから、今どこなのかはすぐわかるはずですが、
何が難しいんでしょうか。
#include <stdio.h>
enum State { INITIAL, PERCENT, EVENT, CATEGORY, PERCENT2 };
enum State state = INITIAL;
int CheckStr(char *str, int *pos)
{
int c, i = 0; char *s1, *s2;
s1 = s2 = str;
while (c = *s1++) {
switch (state) {
case INITIAL:
if (c == '%') { state = PERCENT; break; }
*s2++ = c; break;
case PERCENT:
if (c == '%') { pos[i++] = s1-str-2; state = EVENT; break; }
*s2++ = '%'; *s2++ = c; break;
case EVENT:
if (c == ',') { pos[i++] = s1-str-1; state = CATEGORY; }
break;
case CATEGORY:
if (c == '%') { state = PERCENT2; break; }
*s2++ = c; break;
case PERCENT2:
if (c == '%') {
pos[i++] = s1-str-2; pos[i++] = s1-str-1;
state = INITIAL; break;
}
*s2++ = '%'; *s2++ = c; break;
}
}
*s2 = '\0';
return i;
}
int main()
{
char buf[] = "abcdef%%100,カテゴリ1%%ghijklmn%%200,カテゴリ2%%opqrst";
int pos[100], n, i;
puts(buf);
n = CheckStr(buf, pos);
for (i = 0; i < n; i++)
printf(" %d", pos[i]);
puts("");
puts(buf);
return 0;
}
|