如何在不截断任何单词的情况下使用缓冲区正确读取 stdin 的输入?
How can i properly read an input from stdin with a buffer without truncating any words?
你好我正在编写一个简单的程序,它打算从标准输入中读取一些文本,然后在该文本中找到一些单词并将其替换为“?”字符,最后将结果放入标准输出。
我的问题是,如果当前缓冲区在一个词的中间结束,而我正在搜索该词,"strstr" 函数将找不到它。
示例:
缓冲区为 10 并找到单词 "amazing"
输入:"Wordnet is a truly amazing piece of software and we use it a lot at Roistr for semantic relevance. One useful part of it is that each synset has examples of the word sense in use. But sometimes, these can mislead a little"
第一个缓冲区:"Wordnet is" -> 没有命中
第二个缓冲区:“真正的 a”-> 没有命中
第三个缓冲区:"mazing pie" -> 没有命中
正如您在第三个缓冲区中看到的那样,我对单词 amazing 进行了误报,因为它被缓冲区长度截断了。
我需要一个不依赖于缓冲区大小的解决方案,因为例如缓冲区[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
有多种方法可以解决这个问题。
其中之一(可能最接近您的解决方案)是逐字符读取输入并检测每个单词的开头和结尾(使用 whitespaces 作为分隔符)。当您到达一个词的末尾时,将它与您要搜索的词进行比较,就完成了。
以上内容可以使用格式化输入(类似于 scanf)来简化,它允许您读取到第一个白色space。
一种更复杂的方法是像现在这样阅读,如果当前缓冲区中的最后一个字没有读完(您可以通过验证缓冲区是否以白色结尾来检查这一点space例如),将缓冲区的最后一部分(从最后一个 space 开始到最后的部分)放回标准输入(使用类似 ungetch() 的东西)。当你再次读取缓冲区时,你会得到完整的单词。
你好我正在编写一个简单的程序,它打算从标准输入中读取一些文本,然后在该文本中找到一些单词并将其替换为“?”字符,最后将结果放入标准输出。
我的问题是,如果当前缓冲区在一个词的中间结束,而我正在搜索该词,"strstr" 函数将找不到它。
示例:
缓冲区为 10 并找到单词 "amazing"
输入:"Wordnet is a truly amazing piece of software and we use it a lot at Roistr for semantic relevance. One useful part of it is that each synset has examples of the word sense in use. But sometimes, these can mislead a little"
第一个缓冲区:"Wordnet is" -> 没有命中
第二个缓冲区:“真正的 a”-> 没有命中
第三个缓冲区:"mazing pie" -> 没有命中
正如您在第三个缓冲区中看到的那样,我对单词 amazing 进行了误报,因为它被缓冲区长度截断了。
我需要一个不依赖于缓冲区大小的解决方案,因为例如缓冲区[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
有多种方法可以解决这个问题。
其中之一(可能最接近您的解决方案)是逐字符读取输入并检测每个单词的开头和结尾(使用 whitespaces 作为分隔符)。当您到达一个词的末尾时,将它与您要搜索的词进行比较,就完成了。
以上内容可以使用格式化输入(类似于 scanf)来简化,它允许您读取到第一个白色space。
一种更复杂的方法是像现在这样阅读,如果当前缓冲区中的最后一个字没有读完(您可以通过验证缓冲区是否以白色结尾来检查这一点space例如),将缓冲区的最后一部分(从最后一个 space 开始到最后的部分)放回标准输入(使用类似 ungetch() 的东西)。当你再次读取缓冲区时,你会得到完整的单词。