2013-09-23 113 views
2

我很難理解標有 「線」 的線路: -C-幫助理解的sscanf

#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

sscanf函數返回值是成功讀取的參數列表中的項目數。

所以,行while ((sscanf(&s[idx], "%s%n", word, &n) > 0)意味着while there is data being read, do this {}

循環將在類型不匹配(這將導致函數返回0)以失敗(它是負的值的整數常量表達式的情況下EOF的情況下打破 - 這也解釋了爲什麼安:我因爲在C中,與0不同的任何值被認爲是true,並且在EOF的情況下,該循環不會中斷)

+0

它如何跳過白色空間的開始? – chanzerre

+0

函數讀取並忽略在下一個非空白字符(空白字符包括空格,換行符和製表符字符)之前遇到的任何空格字符。 – streppel

0

sscanf函數返回成功填充的參數列表中的項目數。如果sscanf將返回正值,則While將被執行。

而且NO,你不應該更換

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

這一行,因爲在輸入故障將返回EOF這是一個非零值,使你的while條件是真實的情況。

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 
} 
0

的sscanf從第一arguement讀取和給定的格式寫它。

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

所以,只要小號陣列有東西在裏面讀的sscanf會讀取它,並存儲在ñ

0

看一看這裏:sscanf explanation

它正在80characters從標準,將它們存儲在的char [] S,然後將它們打印一次一個字。

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