2016-05-27 249 views
1
int main() 
{ 
char inputp1[32], inputp2[32]; 

char input[32]; 

printf("-> "); 
scanf("%s", input); 

strcpy(inputp1, strtok(input , " ,.-")); 
strcpy(inputp2, strtok(NULL, " ,.-")); 
printf("%s\n", inputp1); 
printf("%s\n", inputp2); 

} 

有了這個,我可以輸入:的strtok用空格用C

-> 10.10 // my input 
10 
10 

及其與10-10和10,10相同,但使用10做到這一點:

-> 10 10 
Segmentation fault: 11 

有任何想法嗎?

注:如果這是一個愚蠢的只是告訴我,如果它修復這種不適,刪除此帖子。 謝謝。

+3

帶'%s'的'scanf'直到空白爲止。 – mch

+2

檢查可以返回空指針的函數的返回值,以防它們_do_返回空指針。那麼你可以避免你的代碼崩潰。 –

+0

@mch您的評論不完整。 ''%s''讀取可選的前導空白(忽略它們),然後_then_掃描非空白區域,但不包括後續的空白區域。 – chux

回答

3

如果要讀取第一個空格而不是使用scanf("%s", input);,則會讀取字符,直到讀取第一個空格。

使用fgets(input, size, stdin)來讀取整行。

你也可以使用類似scanf ("%[^\n]%*c", name);的東西這將讀取直到第一個換行符,並且也將刷新換行符,所以它不會導致任何問題。 []被稱爲scanset。你可以閱讀一下here

儘管誘惑,你應該never use gets(),因爲它是不可能說沒有預先知道有多少個字符gets()將讀取的數據,因爲gets()將繼續存儲字符過去的緩衝區的末尾,這是非常危險的使用。它已被用來破壞計算機安全。改爲使用fgets()

+0

是啊scanf()可以從我知道的緩衝區溢出 –

+0

是的我也不喜歡這個'scanf(「%[^ \ n]%* c」,name);'但它仍然不被棄用像gets – Deepanshu

+0

好的,謝謝。然後我可以使用'if((strlen(input)> 0)&&(input [strlen(input) - 1] =='\ n')) \t input [strlen(input) - 1] ='\ 0' ;'刪除換行符 –

1

scanf("%s", input)只讀到第一個空格。要閱讀整行,可以使用fgets(input, sizeof(input), stdin)scanf(" %[^\n]", input);

+4

不同意'scanf(「%[^ \ n]」,輸入);'。這與提示'獲得(輸入)'一樣好,但這並不好。 – chux