Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
你能用scanf解析句子并检测换行符吗?_C_Parsing_Scanf - Fatal编程技术网

你能用scanf解析句子并检测换行符吗?

你能用scanf解析句子并检测换行符吗?,c,parsing,scanf,C,Parsing,Scanf,我知道如何使用scanf将句子解析为单个单词: while(1){ scanf("%s", buffer) ... } 但是,如果我输入一个像1233这样的句子,我如何在while循环中找出缓冲区中的单词是否是我按下之前的单词 我想用scanf几乎不可能,但可能有一个类似的函数?您应该使用fgets()阅读整行内容,并像这样解析它: char buffer[BUFSIZE] = {}; // BUFSIZE should be large enough for o

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

while(1){
    scanf("%s", buffer)
    ...
}
但是,如果我输入一个像
1233
这样的句子,我如何在while循环中找出缓冲区中的单词是否是我按下
之前的单词

我想用
scanf
几乎不可能,但可能有一个类似的函数?

您应该使用
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[]
}

如果你只对最后一句话感兴趣,你可以很容易地自己做。如果行数超过缓冲区大小,则所提供的fgets()解决方案很容易变得复杂-最终可能会在多个fgets()调用中拆分一个字。你应该准备好应付这种情况

scanf()本身就很危险——它会将任意长度的单词读入缓冲区。如果依赖于%s,请始终记住将其与长度说明符一起使用。不过,我很确定,您实际上无法使用scanf()实现所需的功能


您最好逐个字符地处理输入。当你点击空格时,你就处于断字状态。当你点击一个新行时,你就到了最后一个字。

你需要知道行的长度不会超过(BUFSIZE-1)个字符。如果更多的话,最终会在fgets()调用中分解单词。正确,因此我会在旁边发表评论。唯一的其他方法是使用动态分配的字符串缓冲区,这不在本问题的范围内。此外,如果你这样做,你最好用C++来使用它的StrugSuffic。