1. 程式人生 > >輸入輸出時關於緩衝區的一點問題

輸入輸出時關於緩衝區的一點問題

1.緩衝區

1.什麼是緩衝區

緩衝區(buffered)是一塊記憶體,把輸入的字元臨時儲存在這塊記憶體裡,然後等待操作。

2.為什麼需要緩衝區

首先在若干字元作為一個塊傳輸比逐個傳送字元耗費的時間少。其次如果你輸入有誤。就可以使用您的鍵盤更改功能來修正錯誤。並且最終按下回車,就可以傳送正確的輸入。——C primer plus

3.緩衝區的型別

緩衝區的型別有兩種
1.完全緩衝
對於完全緩衝,只有當緩衝區滿時才會被清空
2.行緩衝
對於行緩衝,遇到一個換行符時將被清空緩衝區(內容被放送至目的地),但是換行符保留在緩衝區中。(這時會出現一些問題)

2.各種函式

1.getchar()

getchar的作用是從stdin流中讀取一個字元,所以當緩衝區中有字元時,它將直接讀取資料而不需要鍵盤手動輸入。getchar()需要輸入回車結束,但是前提是緩衝區中無資料,如果緩衝區中遺留換行符,換行符將被接收,從而導致getchar()直接結束。getchar()用於接收字元時,終止值為第一個接收的字元。為char型別。

2.scanf

函式 scanf() 是從標準輸入流(stdin)stdio (標準輸入裝置,一般指向鍵盤)中讀內容的通用子程式,可以說明的格式讀入多個字元,並儲存在對應地址的變數中。所以scanf在讀取時,有可能也會因為緩衝區的多餘資料,導致輸入錯誤,跳過輸入等問題。主要時scanf(“%d”,,);,因為scanf在此下接收任意一個字元,其性質跟getchar()相仿。所以導致出錯。而在其他格式下,scanf會跳過緩衝區的空格,換行符,製表符等等,不回出現上述錯誤情況。

3.出錯與解決方案

正是由於函式從緩衝區取值,而緩衝區內部可能遺留換行符等等資料,導致輸入提前結束。我們可以用getchar()將緩衝區的字元讀取並且棄掉。達到清空緩衝區的目的。防止緩衝區的資料對我們鍵盤輸入造成干擾。除此之外,我從其他部落格中發現還有利用scanf清除緩衝區資料。大家可以去搜一下,有點玄學。

4.一點廢話

以上內容全是,經過看書,搜尋資訊,自己寫的,或許有些錯誤,望指正!

相關推薦

輸入輸出關於緩衝區一點問題

1.緩衝區 1.什麼是緩衝區 緩衝區(buffered)是一塊記憶體,把輸入的字元臨時儲存在這塊記憶體裡,然後等待操作。 2.為什麼需要緩衝區 首先在若干字元作為一個塊傳輸比逐個傳送字元耗費的時間少。其次如果你輸入有誤。就可以使用您的鍵

InputStreamReader與OutputStreamWriter的輸入輸出編碼問題

用InputStreamReader與OutputStreamWriter從客戶端向伺服器傳送中文資料時,很容易出現亂碼,原因是編解碼不對應,我們寫程式碼時用OutputStreamWriter向外寫資料時沒有設定編碼格式,系統自動採用預設的編碼,eclipse一般為UTF-

使用VS2017輸入輸出出現控制檯閃退解決方法

當使用VS2017執行下列輸入輸出程式時 ,控制檯直接閃退: #include<iostream> using namespace std; int main() { i

刷OJ輸入輸出與字符串

並且 urn 字符串 cnblogs cout strlen c語言 流式 但是 輸入輸出與測試方法 對於剛開始接觸OJ(Online Judge)的同學估計對於OJ的輸入輸出存在疑惑,OJ的輸入輸出基本都是使用標準輸入輸出(也稱標準I/O,即直接讀鍵盤、寫屏幕)。 OJ的

關於復數輸入輸出一點見解

break turn char 是否 subst 如果 isp 好運 others 我只能說復數這個東西是真的惡心,沒話講 因為大家都知道的,輸入格式就很多樣,輸出也很多樣。 只得哇的一聲哭出來。 因為我是c++運算符重載要用,所以手打了“一萬個if” 大家只看clss C

Java的輸入輸出遇到的一點問題

() main public 可用 util clip 回收 char 錯誤 1 //package com.yunying.test; 2 import java.io.Console; 3 import java.util.Scanner; 4 //學習io

習題 13.2 從鍵盤輸入一批數值,要求保留3位小數,在輸出上下行小數點對齊。

C++程式設計(第三版) 譚浩強 習題13.2 個人設計 習題 13.2 從鍵盤輸入一批數值,要求保留3位小數,在輸出時上下行小數點對齊。 程式碼塊: #include <iostream> #include <iomanip> using names

C語言指標知識點(二):指標在函式的輸入輸出 的性質

主調函式可以把棧區、堆區、全域性區的資料地址傳給被調函式;被調函式只能返回堆區和全域性區的資料及地址。 指標作為函式的傳入引數,由主調函式分配記憶體;指標作為函式的輸出時,由被調函式分配記憶體。 如果想通過形參改變實參的內容,必須地址傳遞(C中,C++中還可以通過引用的

關於競賽輸入輸出的處理

  用十進位制整數來表示輸出的最少位數。 注意若實際位數多於定義的寬度,則按實際位數輸出, 若實際位數少於定義的寬度則補以空格或0。 精度   精度格式符以“.”開頭,後跟十進位制整數。意義是:如果輸出數字,則表示小數的位數;如果輸出的是字元, 則表示輸出字元的個數;若實際位數大於所定義的精度數,則截去超過的

C語言中的輸入輸出流和緩衝區(重點)詳解

導讀: C語言中我們用到的最頻繁的輸入輸出方式就是scanf()與printf()。 scanf(): 從標準輸入裝置(鍵盤)讀取資料,並將值存放在變數中。 printf(): 將指定的文字/字串輸出到標準輸出裝置(螢幕)。注意寬度輸出和精度 輸出控制。 C語言藉助了相應的緩衝區

socket輸入輸出緩衝區以及阻塞模式

socket緩衝區 每個 socket 被建立後,都會分配兩個緩衝區,輸入緩衝區和輸出緩衝區。write()/send() 並不立即向網路中傳輸資料,而是先將資料寫入緩衝區中,再由TCP協議將資料從緩衝區傳送到目標機器。一旦將資料寫入到緩衝區,函式就可以成功返回,不管它們

C 語言 6.13 輸入一些整數,程式設計計算並輸出其中所有整數的和,輸入負數不累加,繼續輸入下一個數。輸入零時表示程式結束。

#include <stdio.h> int main() { int i,n,sum=0; printf("請一個個輸入數字,按回車確定輸入的數字\n"); for (i=1;;i+

從鍵盤輸入若干個學生成績,統計並輸出最高成績和最低成績,當輸入負數結束輸入

#include<iostream> using namespace std; int main() { double a[100]; double max=0,min=100,t; int i; for(i=0;i<100;i++) {

Linux中輸入輸出緩衝區的重新整理

我們知道printf()函式有buff緩衝區,但是這個緩衝區是怎麼工作的呢。 其實我們程式有scanf或gets等這種輸入函式的時候,有沒有發現,當我們輸入字串等資料在視窗的時候,並不會立馬輸出我們的字元,需要我們繼續按下回車或別的與字串無關的操作才能使字串列印至螢幕。 這就是因為這些輸入函

JavaScript 編寫一個函式,要求輸入年月日分秒,輸出該年月日分秒的下一秒。

function time(into){ var TimeF=into.substring(0,into.length-1); var Time=TimeF.replace(/([^\u0000-\u00FF])/g,'-'); var

Windows平臺下GCC程式設計之從鍵盤上輸入一個3*3的整數矩陣,求其各行的平均值並輸出輸出保留兩位小數

Code::Blocks 16.01 + GCC 4.9.2 for Windows上編譯執行成功 附帶一張C++控制符 //2. 從鍵盤上輸入一個3*3的整數矩陣,求其各行的平均值並輸出,輸出時

編寫一個函式,要求輸入年月日分秒, 輸出該年月日分秒的下一秒

/*************************************      編寫一個函式,要求輸入年月日時分秒,      輸出該年月日時分秒的下一秒。      如輸入2004年12月31日23時59分59秒,      則輸出2005年1月1日0時0分0秒 

MFC C++ Format 16進位制輸出需要注意的一點

究其原因,%x 是 unsigned int  或  int  型輸出 ,所以 printf("%x", a) 在執行時將自動將 a 型別提升(char 將提升至 int;unsigned char 將提升至 unsigned int), 注意到 char 是 signed(有符號的),如果這時 a 是負數

JAVA學習中的一點小發現:LinkedList中.poll()方法在輸出使用應注意的小點

在學習JAVA類集一章中關於LinkedList子類中.poll()方法易錯點的分析心得 例如如下程式碼: package Test; import java.util.LinkedList; public class LinkedListDemo01 { public

輸入年月日分秒,輸出下一秒的時間。

#include "stdio.h" void main() {int yea,mon,day,hou,min,sec;while(1){printf("請輸入年月日時分秒!\n");scanf("%d%d%d%d%d%d",&yea,&mon,&d