Что является лучшим способом для поиска first unescaped появление символа в данной строке?Найти первое появление unescaped character
Вот как я это сделал, но у меня есть ощущение, что это слишком сложно.
/*
* Just like strchr, but find first -unescaped- occurrence of c in s.
*/
char *
strchr_unescaped(char *s, char c)
{
int i, escaped;
char *p;
/* Search for c until an unescaped occurrence is found or end of string is
reached. */
for (p=s; p=strchr(p, c); p++) {
escaped = -1;
/* We found a c. Backtrace from it's location to determine if it is
escaped. */
for (i=1; i<=p-s; i++) {
if (*(p-i) == '\\') {
/* Switch escaped flag every time a \ is found. */
escaped *= -1;
continue;
}
/* Stop backtracking when something other than a \ is found. */
break;
}
/* If an odd number of escapes were found, c is indeed escaped. Keep
looking. */
if (escaped == 1)
continue;
/* We found an unescaped c! */
return p;
}
return NULL;
}
Зависит от определения лучшего, но ваше решение кажется больше работы, чем необходимо. Скорее, используя strchr и backtracking (который смотрит на каждую обратную косую черту дважды), вы можете читать вперед и отслеживать состояние (escaped/unescaped), таким образом, глядя только на каждого персонажа один раз. –
Я понимаю, что вы имеете в виду. С другой стороны, это позволяет мне проверять только экраны, когда я знаю, что это действительно необходимо. С вашим решением стоимость отслеживания побегов будет выплачиваться за каждый проверенный персонаж, независимо от того, есть ли у него побеги или нет. Я думаю, что лучше всего зависит от характера тестируемых строк, т. Е. Отношения экранированных символов. –
Зависит от того, что вы подразумеваете под «стоимостью». strchr() смотрит на все те символы, которые ваш код избегает проверки на бегство, поэтому его не так, как будто они не тестируются, хотя вам нужно будет проверить каждый символ как для c, так и для \ (который не кажется очень дорогостоящим, хотя, если вы использовали справочную таблицу, вы можете проверить оба сразу). –