我知道scanf
如何用于将句子解析为单个单词:
while(1){
scanf("%s", buffer)
...
}
但是,如果我输入像one two three<return>
这样的句子,如果我在缓冲区中输入的单词是我按下<return>
之前的那个单词,怎么能在while循环中找到? / p>
我想scanf
几乎不可能,但也许有类似的功能?
答案 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()来实现你所需要的。
您最好按字符处理输入字符。当你到达一个空间时,你就是一个单词突破。当你点击换行符时,你就是最后一句话。