2

我很难理解标有“线”的线:-

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<ctype.h>

int main(void)
{
char s[81], word[81];
int n= 0, idx= 0;

puts("Please write a sentence:");
fgets(s, 81, stdin);
while ( sscanf(&s[idx], "%s%n", word, &n) > 0 )    //line
{
    idx += n;
    puts(word);
}

return 0;
}

我可以将标有“行”的行替换为以下内容:

while ( sscanf(&s[idx], "%s%n", word, &n) )
4

5 回答 5

4

sscanf函数返回值是参数列表中成功读取的项目数。

所以,这条线的while ( (sscanf(&s[idx], "%s%n", word, &n) > 0 )意思是while there is data being read, do this {}

循环将在类型不匹配(这将导致函数返回0EOF失败的情况下中断(这是一个负值的整数常量表达式 - 这也解释了为什么你不能使用 just while ((sscanf(&s[idx], "%s%n", word, &n)),因为在 C 中任何0考虑不同的值,true并且在EOF循环不会中断的情况下)

于 2013-09-23T13:19:00.610 回答
0

sscanf函数返回参数列表中成功填充的项目数。While如果sscanf将返回正值,将被执行。

不,你不应该用

while ( sscanf(&s[idx], "%s%n", word, &n) )

因为在输入失败的情况下,它将返回EOF一个非零值,使您的while条件为真。

于 2013-09-23T13:20:01.083 回答
0

这是一个小翻译:

int words_read;
while (1) {

    // scscanf reads with this format one word at a time from the target buffer
    words_read = sscanf(
          &s[idx] // address of the buffer s + amount of bytes already read
        , "%s%n" // read one word
        , word // into this buffer
        , &n // save the amount bytes consumed inbto n
        );


    if (words_read <= 0) // if no words read or error then end loop
        break;

    idx += n; // add the amount of newlyt consumed bytes to idx

    puts(word); // print the word
} 
于 2013-09-23T13:22:20.063 回答
0

sscanf 从第一个参数中读取并以给定格式写入。

sscanf(string to read, format, variables to store...)

因此,只要s数组中有要读取的内容,sscanf 就会读取它并存储在wordn中。

于 2013-09-23T13:22:57.213 回答
0

看看这里:sscanf 解释

它从标准输入中获取 80 个字符,将它们存储在 char[] 中,然后一次打印一个单词。

while ( sscanf(&s[idx], "%s%n", word, &n) > 0 ) //copy from "s" into "word" until space occurs
//n will be set to position of the space
//loop will iterate moving through "s" until no matching terms found or end of char array
于 2013-09-23T13:24:09.440 回答