嗨我正在编写一个简单的程序,打算从stdin中读取一些文本,然后在该文本中找到一些单词并用“?”替换它。字符,最后将结果放在标准输出中。
我的问题是,如果当前缓冲区在单词的中间结束并且我正在搜索该单词,则“strstr”函数不会将其视为命中。
示例:
使用Buffer of 10并找到“惊人”一词
输入:“Wordnet是一个真正令人惊叹的软件,我们在Roistr中使用它来进行语义相关。其中一个有用的部分是每个synset都有使用中的单词sense的例子。但有时,这些可能误导一点点“
First Buffer:“Wordnet is” - >没有命中
第二缓冲区:“真正的” - >没有命中
第三缓冲区:“mazing pie” - >没有命中
正如你在第三个缓冲区中看到的那样,我得到了令人惊讶的错误,因为它被缓冲区长度切断了。
我需要一个不依赖于缓冲区大小的解决方案,因为例如缓冲区[500]将解决此示例中的问题,但如果我得到50000输入,问题可能会再次出现。
由于
抱歉我的英文。
我的代码:
char* aux = "is";
char* pch;
char buff[100];
int readd;
int stringsize = strlen(aux);
while (((readd = read(0, buff, sizeof buff)) > 0)) {
pch = strstr(buff, aux);
if (pch != 0) {
strncpy(pch, "?????????????????", stringsize);
}
write(1, buff, readd);
}
其他详细信息:
Lenguage:C
环境:Linux / POSIX
答案 0 :(得分:1)
有多种方法可以解决这个问题。
其中一个(最接近你的解决方案)是按字符读取输入字符并检测每个单词的开头和结尾(使用空格作为分隔符)。当你到达一个单词的末尾时,将它与你正在搜索的单词进行比较,然后就完成了。
使用格式化输入(类似scanf)可以简化上述操作,这样可以读取第一个空格。
更复杂的方法是现在读取,如果当前缓冲区中的最后一个单词没有完成(你可以通过验证缓冲区是否以空格结尾来检查),最后一部分缓冲区(从最后一个空格到结尾的部分)返回到stdin(使用ungetch()之类的东西)。当你再次阅读缓冲区时,你会得到完整的词。