全部,調整,報如何在C中分析輸入?
末碼如果我要問用戶進行輸入和搶用,比如說,scanf函數的它(),請問如何處理工作(具體關於緩衝液等)?
什麼意思是當人們引用'沖洗'的緩衝區?我也聽說,刷新輸入(或者,而不是定義?)是不好的做法,但刷新輸出流是fflush()創建的功能。 - 在上文中,'stream'的含義是什麼?
因此,在程序上,如果我要問像輸入:
printf("Enter a string: ");
scanf("%s", string);
發生了什麼輸入;字符串在哪裏被scanf函數'抓住'?
輸入緩衝區中出現「空白」是什麼? (空格字符,NULL,等等?)
在我的腦海裏,雖然文學我讀從來沒有專門針對這些問題,我想象中的來自用戶的輸入,或者從文件,存儲在一些臨時字符數組中被訪問,並使用適當的指針進行打印/存儲。
我之所以提這件事是因爲我有一個相關的問題,下面的代碼:
int main(){
char string[20];
char string2[20];
//strlen test
printf("Enter a string: ");
scanf("%s", string);
printf("\t length: %d\n", strlen(string));
//strcat test
printf("Enter two strings to concatentate: ");
scanf("%s %s", string, string2);
strcat(string2, string);
printf("\nConcatenated: %s\n\n\n", string);
return 0;
}
順便說一句:)strlen的(和strcat的()以上功能均在本地定義,因此參數可能與您從C庫中熟悉的參數不匹配。
產生以下輸出:
我假定,一旦scanf函數遇到空白它假定字符串的末尾。儘管如此,剩餘的輸入仍然存在於緩衝區中。然後,當我要求更多的輸入時,輸入的數據被放置在緩衝區的末尾。因此,這次scanf()被調用時,'andothernonsensehere'被作爲下一個輸入,因爲它在緩衝區中較早存在。
雖然,如果我上面說的是真的,不應該第二個'andothernonsensehere'字符串和在第二個調用'sherrell'輸入的第一個字符串連接在一起嗎?
TL;博士verison 如何刷新緩衝區,以確保輸入的下一個事件將被scanf函數被捕獲()?
完整,編輯,代碼:
#include <stdio.h>
int main(){
char string[20];
char string2[20];
//strlen test
printf("Enter a string: ");
scanf("%s", string);
printf("\t length: %d\n", strlen(string));
clear(); //make sure buffer is empty
//strcat test
printf("Enter two strings to concatentate: ");
scanf("%s %s", string, string2);
strcat(string2, string);
printf("\nConcatenated: %s\n\n\n", string);
return 0;
}
void strcat(char *toCopy, char *org){
while(*org != NULL) org++; //find end of characters
while((*org++ = *toCopy++) != NULL); //copy
}
int strlen(char *a){
char *b = a;
while(*b++ != NULL);
return b-a;
}
void clear(){
while(getchar() != '\n');
}
謝謝,這個概念現在更有意義了,我在OP的最後加上了完整的代碼,包括我的strcat版本()。任何建議? – sherrellbc
@sherrellbc:我的建議:使用'-Wall'(至少),並使'string'和'string2'變大(或使用更短的輸入)。 (NULL是一個指針);把strlen,strcat並在開始時清楚,並更改名稱以避免與gcc內建相撞;並將這兩個緩衝區更改爲40個字符。它運行良好。 (gcc仍然正確地提醒忽略scanf的返回值,你應該總是檢查scanf的返回值。) – rici
功能配置是一個值得關注的問題嗎? (即在主之前/之後)。我總是以這樣一種方式進行編程,使得我包含了習慣中的函數原型(儘管不在這裏)。我知道,如果你有一個函數調用另一個函數,它定義在它自己下面,那麼調用函數將不會「看到」定義的函數,程序將不會編譯。我驚訝地發現,我編寫的代碼是由於缺少函數原型以及main調用定義後定義的函數而編譯的。 – sherrellbc