在C / C ++中清除輸入緩衝區
筆者介紹:姜雪偉,IT公司技術合夥人,IT高階講師,CSDN社群專家,特邀編輯,暢銷書作者,已出版書籍:《手把手教你架構3D遊戲引擎》電子工業出版社和《Unity3D實戰核心技術詳解》電子工業出版社等。
什麼是緩衝區?
臨時儲存區稱為緩衝區,所有標準輸入和輸出裝置都包含輸入和輸出緩衝器。在標準C / C ++中,流是緩衝的,例如在標準輸入的情況下,
當我們按鍵盤上的鍵時,它不會發送到您的程式,而是由作業系統緩衝,直到時間被分配給程式。
它如何影響程式設計?
在各種情況下,您可能需要清除不需要的緩衝區,以便獲得所需容器中的下一個輸入,而不是在前一個變數的緩衝區中。例如,在遇到“scanf()”之後的C的情況下,如果我們需要輸入一個字元陣列或字元,並且在C ++的情況下,遇到“cin”語句之後,我們需要輸入一在C程式設計的情況下
#include<stdio.h> int main() { char str[80], ch; // Scan input from user -TestGame for example scanf("%s", str); // Scan character from user- 'a' for example ch = getchar(); // Printing character array, prints “TestGame”) printf("%s\n", str); // This does not print character 'a' printf("%c", ch); return 0; }
輸入:
TestGame
一個輸出:
TestGame
在C ++的情況下
#include<iostream> #include<vector> using namespace std; int main() { int a; char ch[80]; // Enter input from user - 4 for example cin >> a; // Get input from user - "TestGame" for example cin.getline(ch,80); // Prints 4 cout << a << endl; // Printing string : This does not print string cout << ch << endl; return 0; }
輸入:
4 TestGame
輸出:
4在上述兩種程式碼中,都不會根據需要列印輸出。原因是被佔用的緩衝區。“\ n”字元保留在緩衝區中,並作為下一個輸入讀取。
如何解決?
在C:
1、使用“while((getchar())!='\ n'); “(鍵入)while((getchar())!='\ n');”讀緩衝區字元直到結束並丟棄它們(包括換行符),
並在“scanf()”語句清除輸入緩衝區之後使用它允許輸入到所需的容器中。
#include<stdio.h>
int main()
{
char str[80], ch;
// scan input from user - TestGame for example
scanf("%s", str);
// flushes the standard input (clears the input buffer)
while ((getchar()) != '\n');
// scan character from user - 'a' for example
ch = getchar();
// Printing character array, prints “TestGame”)
printf("%s\n", str);
// Printing character a: It will print 'a' this time
printf("%c", ch);
return 0;
}
輸入:
TestGame 一個
輸出:
TestGame 一個2、使用“fflush(stdin)”:在“scanf()”語句之後鍵入“fflush(stdin)”也會清除輸入緩衝區,但是避免使用它,並且根據C ++被稱為輸入流“未定義” 11標準。
在C ++的情況下:
1、使用“cin.ignore(numeric_limits :: max(),'\ n'); “: - 在”cin“語句之後輸入”cin.ignore(numeric_limits :: max(),'\ n');“後,放棄包含換行符的輸入流中的所有內容。#include<iostream>
#include<ios> // for <streamsize>
#include<limits> // for numeric_limits
using namespace std;
int main()
{
int a;
char str[80];
// Enter input from user - 4 for example
cin >> a;
// discards the input buffer
cin.ignore(numeric_limits<streamsize>::max(),'\n');
// Get input from user - TestGame for example
cin.getline(str, 80);
// Prints 4
cout << a << endl;
// Printing string : This will print string now
cout << str << endl;
return 0;
}
輸入:
4 TestGame
輸出:
4 TestGame2、使用“cin.sync()”:在“cin”語句之後鍵入“cin.sync()”將放棄緩衝區中的所有內容。雖然“cin.sync()” 不工作在所有實施(根據C ++ 11和上述標準)。
#include<iostream>
#include<ios>
#include<limits>
using namespace std;
int main()
{
int a;
char str[80];
// Enter input from user - 4 for example
cin >> a;
// Discards the input buffer
cin.sync();
// Get input from user - TestGame for example
cin.getline(str, 80);
// Prints 4
cout << a << endl;
// Printing string - this will print string now
cout << str << endl;
return 0;
}
輸入:
4 TestGame
輸出:
4 TestGame使用“cin >> ws”:在“cin”語句之後鍵入“cin >> ws”,告訴編譯器忽略緩衝區,並且在字串或字元陣列的實際內容之前丟棄所有的空格。
相關推薦
在C / C ++中清除輸入緩衝區
筆者介紹:姜雪偉,IT公司技術合夥人,IT高階講師,CSDN社群專家,特邀編輯,暢銷書作者,已出版書籍:《手把手教你架構3D遊戲引擎》電子工業出版社和《Unity3D實戰核心技術詳解》電子工業出版社等。
C語言中的輸入輸出流和緩衝區(重點)詳解
導讀: C語言中我們用到的最頻繁的輸入輸出方式就是scanf()與printf()。 scanf(): 從標準輸入裝置(鍵盤)讀取資料,並將值存放在變數中。 printf(): 將指定的文字/字串輸出到標準輸出裝置(螢幕)。注意寬度輸出和精度 輸出控制。 C語言藉助了相應的緩衝區
C語言清除輸入緩衝區【轉】
在使用scanf輸入時,如果輸入不合法,此時可以檢查其返回值為0,但下次再呼叫時,上次不合法的輸入,還在輸入緩衝區中,此時就會接著不合法,如下:#include <stdio.h>int main(int argc,char** argv){ i
C語言中的輸入方式
讀取 緩沖區 lock 回車 scanf() spa sdn enter 回車符 在c語言中,有gets()、scanf()、getchar()等輸入方式,但是不同的方式處理的方式不同。 scanf()讀取時遇見tab、space、enter時會結束讀取,不會舍棄最後的回車
C++函式中的輸入以及如何使用總結
1.輸入的是陣列的名稱 : int f(int arr[])型別 arr等於陣列第一個元素的地址: arr == &arr[0] int f(int arr[]); //輸入的是陣列的名稱即指標。 int main() {
C語言中的輸入輸出函式(學習筆記)
文章目錄 c語言中的基本輸入與輸出函式 1.格式化輸入輸出函式 1.1printf()函式 1.2scanf()函式 2.非格式化的輸入輸出函式 2.1puts()和gets()函式
C語言清空輸入緩衝區
先來看一段程式碼: #include <stdio.h> int main() { int num; char ch ; scanf("%d", &num); scanf("%c", &ch); printf("hello world
c語言中統計輸入的行數、單詞數與字元數
來源:《c程式設計語言》 功能需求: 寫個函式,用於統計輸入的行數、單詞數與字元數。這裡對單詞的定義比較寬鬆,它是任何其中不包含空格、製表符或換行符的字元序列。 程式碼如下: #include <stdio.h> #define IN 1 #define OUT 0 void wc()
c++中IO輸入輸出流總結<二>
操作 clu 文件 blog trunc pub filename binary team 1 文件的打開和關閉 1.1 定義流對象 ifsteam iflie;//文件輸入流對象 ifsteam iflie;//文件輸出流對象 fsteam iflie;//文
scanf()中的%c 不能正常輸入的問題
urn 輸入流 pri blog 問題 sca 但是 char amp #include <stdio.h> int main() { char a; int b; scanf("%d",&b); scan
C++中的輸入問題
dea int .so i+1 .com clas 回車 區別 一個 C++中幾個輸入函數的用法和區別(cin、cin.get()、cin.getline()、getline()、gets()、getchar())) 1、cin1、cin.get()2、cin.ge
C語言中字符輸入問題
nbsp clas 輸入緩沖 show bsp 解決 har 問題 c語言 先上例題,一道太水太水的題, http://acm.hdu.edu.cn/showproblem.php?pid=1170 讓做一個簡單的計算器。然而入坑了。 #include<stdio.
C#Form.SplitContainer中清除控制元件textbox值(窗體.容器.控制元件)
文章目錄 問題背景 問題程式碼 問題解決 正確清除程式碼 問題延申 問題背景 早上在完善不確定度計算器時,想要清空實驗資料輸入時所有textbox控制元件值。 問題程式碼
C/C++中實現對輸入到EOF的判斷、鍵盤手動輸入檔案結尾符EOF、Python中輸入EOF判斷
C/C++中實現對輸入到EOF的判斷: 在C/C++中,EOF是一個定義在標頭檔案 stdio.h 中的常量,等於-1。 在C/C++中實現遇到檔案結尾符停止讀取: int data; while(scanf("%d",&data)!=EOF){ //EOF即檔案結尾符,-1
如何在C語言程式中統計輸入漢字的個數
C中的漢字用“機內碼”,一個漢字兩位元組,最高位都是1,所以可以用下列程式碼求得一個字串裡漢字的個數: #include<stdio.h> #include<string.h> int main() { char s[1000]; int cn,i,all; whil
C語言:判斷輸入一行中是否包含模式串
C語言:函式與程式結構11 #include<stdio.h> 2 #define MAXLINE 1000 /*最大輸入行長度 */ 3 4 int getline(char line[], int max); 5 int strindex(char source[], c
C/C++中一些基本的輸入輸出用法
1.scanf()與printf() %c格式能夠識別空格和換行並將其輸入 %s通過空格和換行來識別字符串的結束 2.getchar()與putchar() 用來輸入和輸出單個字元 3.gets()與puts() 用來輸入一行字串,gets()識別換行符來
查詢輸入整數二進位制中1的個數/華為機試(C/C++)
題目描述 請實現如下介面 public static int findNumberOf1( int num) { /* 請實現 */
C++中重新整理輸出緩衝區
每一個輸出流都管理一個緩衝區,用來儲存程式讀寫的資料。因此要將資料真正寫到輸出裝置中,就需要重新整理緩衝區。導致緩衝區重新整理的原因大體有以下5種。 1、程式正常結束,作為main函式return操作的一部分,緩衝區被重新整理。 2、當緩衝區滿了的時候,會重新整理緩衝區。 3、可以使用操
C++11中vector的emplace_back用法及輸入輸出操作符的過載
#include <vector> #include <iostream> #include <string> using namespace std; struc