你能用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。