1. 程式人生 > >scanf(“%c”)等問題,清空輸入輸出快取

scanf(“%c”)等問題,清空輸入輸出快取

C語言學習者經常會遇到printf()和scanf()的一些問題,沒有正確輸出或者輸入。例如scanf(“%c”,&ch)沒有接收到輸入字元。或者輸出printf(“\n”)不會換行的問題。

舉個例子:

#include <stdio.h>
int main()
{
	char person[5];
	int i;
	printf("輸入編號:");
	scanf("%d",&i);
	printf("請輸入編號:%d的許可權:",i);
	scanf("%c",&person[i]);
	return 0;
}

上面這個程式碼執行出錯:

原因

清除上一個scanf的快取,因為它接受了一個數字和回車符號,不然下一個scanf()用%c接受字串的時候, 會將上一個的回車符接收到,而不會停下來去等待使用者去輸入一個字元。
getchar();//或者適用getchar去接受上一個的回車符
fflush(stdin);//非標準C,linux下不適用,windows可以使用
setbuf(stdin,NULL);//將輸入緩衝區清空,linux適用

正確的程式碼:

#include <stdio.h>
int main()
{
	char person[5];
	int i;
	printf("輸入編號:");
	scanf("%d",&i);
	printf("請輸入編號:%d的許可權:",i);
	{
		//清除上一個scanf的快取,因為它接受了一個數字和回車符號,
		//不然下一個scanf()用%c接受字串的時候,會將上一個的回車符接收到,
		//而不會停下來去等待使用者去輸入一個字元。
		//getchar();//或者適用getchar去接受上一個的回車符
		//fflush(stdin);//非標準C,linux下不適用,windows可以使用
		setbuf(stdin,NULL);//將輸入緩衝區清空,linux適用

	}
	//scanf("%c",&person[i]);
	scanf(" %c",&person[i]);//或者先去用一個空格去把上一個的回車符匹配掉也可以。
	return 0;
}
備註:輸入緩衝區是stdin,輸出緩衝區是stdout

相關推薦

scanf(“%c”)問題輸入輸出快取

C語言學習者經常會遇到printf()和scanf()的一些問題,沒有正確輸出或者輸入。例如scanf(“%c”,&ch)沒有接收到輸入字元。或者輸出printf(“\n”)不會換行的問題。

jquery自動獲取游標在字串後輸入框文字再聚焦

jquery自動獲取游標在字串後 var str=$("#callnumber").val(); $("#callnumber").val("").focus().val(str

[資料結構]c語言實現鏈棧的入棧出棧銷燬操作

最近在學習資料結構中的棧,於是在此記錄一下棧鏈式結構的抽象資料型別 /* 棧的抽象資料型別 ADT 棧(stack) Data 同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係 Operation InitStack(*S):初始化

C 輸入緩衝區以及fflush(stdin)的使用誤區和解決方法

對C 語言初學者來說,fflush(stdin)函式被解釋為會清空輸入緩衝區的一個系統函式,這是一個曾經幾乎對過一半的說法,隨著電腦科學的進步,在學習的過程中的逐步完善,將fflush(stdin)函式的過去與現在分析一下。 Personal th

定義一個數組陣列初始長度由控制檯獲取 。隨後手動給陣列中每個元素賦值陣列滿後將陣列長度擴充二倍並輸出,清空陣列中所有元素且值繼承陣列長度並重新進行手動新增元素無限死迴圈直至輸出-0後結束程式。

package com.tedu; import java.util.Arrays; import java.util.Scanner; /** * 需求: * 定義一個初始陣列,陣列初始長度由控制檯獲取 * 隨後手動給陣列中每個元素賦值,陣列滿後將陣列長度擴充二倍輸

C# ListBox刪除列表控制元件中選擇的單項多項所有

單項: private void button1_Click(object sender, EventArgs e) { listBox1.Items.Remove(listBox1.SelectedItem); }

AVL樹C++實現(插入刪除查詢遍歷操作)

AVL.h檔案程式碼 #pragma once #include<iostream> #include<stack> #include <assert.h> using namespace std; using namespace std; template<cl

【資料結構】C語言最基礎練習:棧的初始化壓棧出棧遍歷

隨手練習一下,詳細程式碼解釋都在程式碼片裡請仔細看看 如果有什麼不對的地方,請在下方留言 先建立標頭檔案: #define _CRT_SECURE_NO_WARNINGS 1 #ifndef _TEST_H #define _TEST_H //棧的鏈式儲存結構;

C語言輸入緩衝區

先來看一段程式碼: #include <stdio.h> int main() { int num; char ch ; scanf("%d", &num); scanf("%c", &ch); printf("hello world

檢測edittext中文字的輸入狀態內容

import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.View; import and

棧操作包括入棧出棧銷燬棧

#include<malloc.h> #include<string.h> #include<stdio.h> #define OVERFLOW -1 #define STACK_INIT_SIZE 10 #define

JS自動生成動態HTML驗證碼頁面輸入錯誤自動輸入

<html>     <head>         <title>驗證碼</title>         <meta charset="utf-8" />         <style type="text/

kindeditor獲取內容設定kindeditor輸入提示資訊

1初始化kindeditor var clearDefault=true;//是否有預設文字資訊 var editor = KindEditor.create('textarea[name="s_co

Ajax提交數據後form表單

由於 清空 bsp style 不同 註意 res RM input 按鈕不同,頁面相同,還需要顯示的數據不同,這裏會由於頁面的緩存問題,導致,每次點開這個頁面顯示的數據相同。 這不是我們想要的。這就需要清楚表單數據了。 如下: $(‘#myform‘)[0].reset(

shell基礎02 標準文件描述符STDINSTDOUTSTDERR和輸入輸出重定向

stdin isp pen blank input open 日誌文件 重定向 分開 文件描述符 縮寫 描述

微信小程序 輸入

use inf 映射 清空 .com javascrip ace ima on() <view class="weui-cell weui-cell_input"> <image class="r-right" src="../../

windows python2下停止啟動tomcat

import socket import os import os.path import shutil import time # 獲取本機IP地址 def get_host_ip(): """ get host ip address 獲取本機IP地址 :re

關於c++中進位制輸入輸出

#include <iostream> using namespace std; void main() { int a = 010, b = 10, c = 0X10;//以0開頭的數是八進位制數,0X開頭的是16進位制數. //以十進位制顯示資料; cout &

C程式設計--對檔案的輸入輸出(案例)

第十章 問題一(fputc()函式的使用) 從鍵盤中輸入一些字元,逐個把他們送到磁碟上去,直到使用者輸入一個’#'鍵為止; #include<stdio.h> #include<stdlib.h>//用於 exit(0); int ma

ETL-kettle基本操作表的輸入輸出

基本操作介面 在上圖中的轉換隻是一個容器,真正的轉換步驟需要自己去建立,還是在檔案中新建--->轉換     這個轉換才是真正的建立自己的業務功能轉換。   表輸入介面資訊介紹 文字檔案介面概述 然