2010-08-24 207 views
12

什麼是語法,輸入字符串與空間多於一個字,即兩者之間通過scanf()函數沒有得到()多字字符串輸入

+1

看起來更像C++的問題,如果我錯了,糾正我? – DumbCoder 2010-08-24 09:31:11

回答

13

是否

scanf("%[^\t\n]",string); 
+0

@subhashis:如果它符合最初的意圖,是否有機會接受? – Chubsdad 2010-08-24 10:41:17

+0

如果輸入以''\ t''或'\ t123 456「''\ n''開頭,則不會讀入'字符串'。 – chux 2015-01-02 21:22:44

3

我不要認爲scanf()是可行的。 如果你知道你想讀的單詞數,你可以用

char str1[100], str2[100]; 
scanf("%s %s", str1, str2); 

注意,這是一個巨大的安全漏洞,因爲用戶可以很容易地輸入一個字符串,它比分配的空間再閱讀。

如果您不知道單詞的數量,則可能需要更改您的問題。你需要讀什麼?爲什麼你不想使用gets(),爲什麼它必須是scanf()?

+1

當然'gets'也是它自己的安全漏洞,而應該用'fgets'代替。 – 2010-08-24 09:41:07

+6

如果你使用像scanf(「%99s%99s」,str1,str2)這樣的公認的scanf格式參數,那麼就沒有「巨大的安全漏洞」 – user411313 2010-08-24 10:04:02

+0

感謝gordon,我不知道格式化器的寬度字段。但是如何處理> 99個字符的單詞呢?字符是否被正確丟棄,還是會在輸入緩衝區中逗留並導致下一個格式化程序失敗? – 2010-08-24 11:10:31

1

如果你想你可以從文件中讀取整條生產線:

scanf("%[^\n]\n", line); 

現在,你可以使用sscanf會得到每一個字:

sscanf(line, "%s", word); 
line += strlen(word) + 1; 

「行」和「字」是字符指針。

請注意線路如何走向下一個單詞。

+0

'scanf(「%[^ \ n] \ n」,行);'**不會**總是讀整行。它不會將任何內容保存到'line'中,輸入是'「\ n」'並且'\ n''將保留在'stdin'中。 'sscanf(line,「%s」,word);'如果'line'只由空格組成,''不會將任何內容保存到'word'中。 – chux 2015-01-02 21:18:25

3
char name[50]; 
printf("Enter your full name: "); 
scanf("%[^\n]s",name); 

這裏[^\n表明scanf()將繼續接收字符到name[ ]直到遇到\n

+3

scanf(「%[^ \ n] s」,name);''中不需要's'。 – chux 2015-01-02 21:16:01

2

更好地使用fgets()scanf()閱讀一行用戶輸入。

如果代碼必須使用scanf()然後

char buf[100]; 

// Read up to 99 char and then 1 \n 
int count = scanf("%99[^\n]%*1[\n]", buf); 

if (count == EOF) { 
    Handle_EndOfFile(); // or IO error 
} 

if (count == 0) { // Input began with \n, so read and toss it 
    scanf("%*c"); 
} 

現在解析buf個別單詞。

1
char field1[40]; 
char field2[40]; 
char field3[40]; 
char field4[40]; 
char field5[40]; 
char field6[40]; 
/* 
* sscanf(workarea, format, field of pointers) 
* Interpret [^ ]  as a field ending in a blank 
* Interpret [^' '] as a field ending in a blank 
* Interpret [^ |\t] as a field ending in blank or tab char 
* Interpret [^' '|\t] as a field ending in blank or tab char 
* Interpret [^ |\t\n] as a field ending in blank, tabchar or end-of-line 
* 
*/ 
strcpy(workarea,"Bread milk eggs cheese tomatoes cookies \n"); 
i=sscanf(workarea," %[^' '|\t] %[^[' '|\t] %[^' '|\t] %[^' '|\t] %[^' '|\t] %[^' '|\t|\n] ", 
      field1,field2,field3,field4,field5,field6); 

此掃描結果中包含 「麪包」,包含字段2 「奶」,...含 「曲奇」 字段6 FIELD1。在第一個到最後一個單詞之間,您可能會有一個或多個空格或製表符 以下cookie的結尾可能是三個空格,製表符或換行符中的一個,它們將被刪除而不屬於「cookies」。