найти образец букв в слове - PullRequest
0 голосов
/ 01 февраля 2012

Можно ли как-нибудь найти слово "tro_ _ _e", где подчеркивания представляют пропущенные буквы?

У меня есть текстовый файл с 7-буквенным словом в каждой строке. * например 1003 *

trouble
control
reached
further
helping
shatter
biggest

Я пытаюсь сравнить каждое слово со строкой

char check[10]="tro\0\0\0e"

в данный момент я читаю каждую строку и сравниваю, используя:

if(strstr(pword,check)!=NULL)
{
    fprintf(wfile,"%s\n",pword);
    }
}

fclose(file);

fclose(wfile);

Я понимаю, что мой текущий вывод в wfile:

control
trouble

происходит из-за того, что между «тро» и «е» есть три \ 0, поэтому сравнение просто находит «тро» в словах.

Можно ли как-нибудь найти слово "tro_ _ _e", где подчеркивания представляют пропущенные буквы?

Это для игры палач, и поэтому слова в файле не всегда одинаковы, не всегда 7 букв в длину, и шаблон не всегда "tro_ _ _e", поскольку шаблон представляет буквы, уже угаданные игроком. Ответ в этом случае: «беда»

Например, если игрок угадал «r», «u» и «l». У меня была бы строка, которая была буквально.

char check[10]="\0r\0u\0l\0\0\0\0\0" поэтому поиск, который я хотел бы найти, был бы для любых слов с шаблоном "_r_u_l"

Ответы [ 4 ]

1 голос
/ 01 февраля 2012

Если вы действительно открыты для решения C #, как подсказывают ваши теги:

string pword = "control\r\ntrouble\r\nreached\r\nfurther\r\nhelping\r\nshatter\r\nbiggest";
System.Text.RegularExpressions.Regex re = new System.Text.RegularExpressions.Regex("tro...e");
System.Text.RegularExpressions.MatchCollection mc = re.Matches(pword);
foreach (System.Text.RegularExpressions.Match m in mc)
{
   Console.WriteLine(m.Value);
}
0 голосов
/ 01 февраля 2012

системы Posix имеют, с regcomp, regexec и так далее, если вам нужно расширяемое решение.

0 голосов
/ 01 февраля 2012

Не связывайтесь с \0 - каждая функция в string.h считает, что она завершает строки. Используйте _.

Вероятно, вы должны написать свою собственную функцию. что-то вроде:

int isval(const char *word,const char *pat) {
 while (*word) {
  if (*pat!='_' && *pat!=*word) return 0;
  word++;
  pat++;
 }
 return !*pat;
}
0 голосов
/ 01 февраля 2012

Я не совсем уверен, в чем ваша проблема на самом деле, но я думаю, вы могли бы объединить два поиска / условия с AND, например: if(strstr(pword,check) != NULL && pword[6]=='e') ...

...