你能用`scanf`解析句子并检测新行吗?

时间:2011-09-10 03:27:52

标签: c parsing scanf

我知道scanf如何用于将句子解析为单个单词:

while(1){
    scanf("%s", buffer)
    ...
}

但是,如果我输入像one two three<return>这样的句子,如果我在缓冲区中输入的单词是我按下<return>之前的那个单词,怎么能在while循环中找到? / p>

我想scanf几乎不可能,但也许有类似的功能?

2 个答案:

答案 0 :(得分:2)

您应该使用fgets()来读取整行,然后解析它:

char buffer[BUFSIZE] = {};        // BUFSIZE should be large enough for one line
fgets(buffer, BUFSIZE, stdin);    // read from standard input, same as scanf
char *ptr = strtok(buffer, " ");  // second argument is a string of delimiters
                                  // can be " ,." etc.
while (ptr != NULL) {
    printf("Word: '%s'\n", ptr);

    ptr = strtok(NULL, " ");      // note the NULL
}

检查当前单词是否是最后一个单词是微不足道的:

while (ptr != NULL) {
    char word[BUFSIZE] = {};
    strcpy(word, ptr);         // strtok clobbers the string it is parsing
                               // So we copy current string somewhere else.
    ptr = strtok(NULL, " ");

    bool is_last_word = (ptr == NULL);
    // do your thing here with word[]
}

答案 1 :(得分:0)

如果你只对最后一个字感兴趣,你可以很容易地自己做。如果行超过缓冲区大小,那么所提出的fgets()解决方案很容易出现复杂问题 - 您可能会在多个fgets()调用之间拆分一个单词。你应该准备好应对这种可能性。

scanf()本身很危险 - 它会将任意长度的单词读入缓冲区。如果您依赖它,请始终记住使用带有长度说明符的%s。我很确定你实际上不能使用scanf()来实现你所需要的。

您最好按字符处理输入字符。当你到达一个空间时,你就是一个单词突破。当你点击换行符时,你就是最后一句话。