嗨,我正在编写一个简单的程序,该程序旨在从stdin中读取一些文本,然后在该文本中找到一些单词,然后将其替换为“?”。字符,最后将结果放到标准输出中。
我的问题是,如果当前缓冲区在一个单词的中间结束,而我正在搜索该单词,则“ strstr”函数将找不到它。
例子:
使用Buffer 10并找到单词“ amazing”
输入:“ Wordnet是一款真正令人惊叹的软件,我们在Roistr上经常使用它来实现语义相关性。其中一个有用的部分是,每个同义词集都有使用中的词义示例。但是有时,它们可能会误导一些人。”
第一个缓冲区:“ Wordnet是”->未命中
第二个缓冲区:“一个真正的a”->未命中
第三缓冲区:“惊人的馅饼”->没有命中
如您所见,在第三个缓冲区中,我对“ amazing”一词有错误的否定,因为它被缓冲区长度截断了。
我需要一个不依赖于缓冲区大小的解决方案,因为例如,buffer [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);
}
其他详情:
语言:C
环境:Linux / POSIX
有多种方法可以解决此问题。
其中之一(可能最接近您的解决方案)是逐个字符读取输入的字符,并检测每个单词的开头和结尾(使用空格作为分隔符)。当您到达一个单词的结尾时,可以将其与要搜索的单词进行比较,然后就可以完成了。
可以使用格式化的输入(类似于scanf)简化以上操作,这可以使您读取第一个空格。
一种更复杂的方法是现在进行读取,并且如果当前缓冲区中的最后一个单词未完成(例如,可以通过验证缓冲区是否以空格结尾来进行检查),则将缓冲区的最后一部分放入(从最后一个空格到结尾的部分)返回到stdin(使用诸如ungetch()之类的东西)。当您再次读取缓冲区时,您将获得完整的单词。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句