如何使用缓冲区正确读取stdin的输入而不截断任何单词?

时间:2015-04-23 10:52:57

标签: c linux buffer posix stdin

嗨我正在编写一个简单的程序,打算从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

1 个答案:

答案 0 :(得分:1)

有多种方法可以解决这个问题。

其中一个(最接近你的解决方案)是按字符读取输入字符并检测每个单词的开头和结尾(使用空格作为分隔符)。当你到达一个单词的末尾时,将它与你正在搜索的单词进行比较,然后就完成了。

使用格式化输入(类似scanf)可以简化上述操作,这样可以读取第一个空格。

更复杂的方法是现在读取,如果当前缓冲区中的最后一个单词没有完成(你可以通过验证缓冲区是否以空格结尾来检查),最后一部分缓冲区(从最后一个空格到结尾的部分)返回到stdin(使用ungetch()之类的东西)。当你再次阅读缓冲区时,你会得到完整的词。