我想在文本中搜索一个字符块(单词) 例如,我有下一个文本" Hello xyz world",我想搜索" xyz",注意单词后面的空格。
// The Text
const char * text = "Hello xyz world";
// The target word
const char * patt = "xyz ";
size_t textLen = strlen(text),
pattLen = strlen(patt), i, j;
for (i = 0; i < textLen; i++) {
printf("%c", text[i]);
for (j = 0; j < pattLen; j++) {
if (text[i] == patt[j]) {
printf(" <--");
break;
}
}
printf("\n");
}
结果必须如下:
但不幸的是,结果如下:
它收集整个文本中的所有相似字符,而不仅仅是目标字符(单词)。
如何解决这个问题?
答案 0 :(得分:2)
你必须在打印之前完成一个完整的子串匹配;在第一遍中标记适用的字符,然后再打印第二遍以打印结果。在您的情况下,您将创建第二个数组,其布尔值对应于第一个数组,如
text =&#34; Hello xyz world&#34 ;; 匹配000000111100000
我假设您可以在线找到基本的子串匹配程序。在第二遍打印很容易:你已经有了逻辑。而不是if (text[i] == patt[j])
,只需使用if match[i]
。
这是否足以提示?
答案 1 :(得分:1)
你应该从头开始检查你的模式的每个字母(而不是检查整个模式)。试试这个(未经测试):
int currIndex = 0;
for (i = 0; i < textLen; i++) {
printf("%c", text[i]);
if (text[i] == patt[currIndex]) {
for (j = 0; j < pattLen; j++) {
if(text[i+j] != patt[j]){
continue;
}
}
printf(" <--");
currIndex++;
if(currIndex==pattLen)
currIndex = 0;
}
else{
currIndex = 0;
}
printf("\n");
}
注意: 不是达到此目的的最佳方法,但最简单的是
注2:此问题应该按原样关闭:
寻求调试帮助的问题(&#34;为什么这段代码不起作用?&#34;)必须 包括所需的行为,特定的问题或错误 在问题本身中重现它所需的最短代码。 没有明确问题陈述的问题对其他问题没有用 读者。请参阅:How to create a Minimal, Complete, and Verifiable example.
答案 2 :(得分:1)
在开始打印任何<--
之前,您需要确保完全匹配。并且为了避免在patt
上通过数组末尾进行访问,当数组中保留少于pattLen
个字符时,您将不得不停止搜索。
然后,当您找到完整匹配项后,您可以打印patt
的内容,然后打印<--
并增加pattLen-1
指针的位置。最后,您将不得不从文本中复制剩余的字符。
代码可能变成:
// The Text
const char * text = "Hello xyz world";
// The target word
const char * patt = "xyz ";
size_t textLen = strlen(text),
pattLen = strlen(patt), i, j;
for (i = 0; i <= textLen - pattLen; i++) { // don't search if less that pattLen remains
printf("%c", text[i]);
if (text[i] == patt[0]) { // first char matches
int found = 1; // be optimistic...
for (j = 1; j < pattLen; j++) {
if (patt[j] != text[i + j]) {
found = 0;
break; // does not fully match, go on
}
}
if (found) { // yeah, a full match!
printf(" <--"); // already printed first char
for (j = 1; j < pattLen; j++) {
printf("\n%c <--", patt[j]);// print all others chars from patt
}
i += pattLen - 1; // increase index...
}
}
printf("\n");
}
while (i < textLen) {
printf("%c\n", text[i++]); // process the end of text
}
以上代码为"xyz "
以及"llo"
...