如何在不截断任何单词的情况下使用缓冲区正确读取 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() 的东西)。当你再次读取缓冲区时,你会得到完整的单词。