c語言輸入非法數據會怎樣,c語言怎麼處理非法輸入

本文目錄一覽:

C語言編程問題,求高手解答遇到輸入非法字符時,怎麼處理。

#includestdio.h

#includetime.h

#include stdlib.h

#include “regex.h”

const int MAX_LEN = 1000;

/*去掉字符串兩端的空格*/

char * trimString(char guessString[])

{

int head = 0 ,rear = strlen(guessString)-1;

char result[MAX_LEN];

int i,k;

/*開頭空格*/

while( guessString[head] != ‘\0’

(guessString[head] == ‘ ‘ || guessString[head] == ‘ ‘ )

)

{

head ++;

}

/*尾部空格*/

while( rear = 0

(guessString[rear] == ‘ ‘ || guessString[rear] == ‘ ‘ )

)

{

rear –;

}

for(i = head ,k = 0; i = rear ; i++ , k++)

{

result[k] = guessString[i];

}

result[k] = ‘\0’;

return result;

}

/*

提取字符串中的【正整數】。

如果是恰好包含【一個正整數】的字符串(正數前後可以有任意個空格,正數可以有多餘的前導0),則返回這個正數;

如果是一個空串,則返回 -1

如果包含非數字字符,則返回-2

*/

int transStringToNum(char guessString[])

{

int i;

int head = 0 ,rear = strlen(guessString)-1;

char trimGuessString[MAX_LEN];

int num = 0;

// 去前後空格

strcpy(trimGuessString,trimString(guessString));

// 檢查是否空串

if( 0== strlen(trimGuessString) )

{

return -1;

}

// 檢查是否有非數字字符

for(i = 0 ; trimGuessString[i] != ‘\0’ ; i ++)

{

if(trimGuessString[i] ‘0’ || trimGuessString[i] ‘9’)

{

return -2;

}

}

// 字符串轉換成數字

for(i = 0 ,num = 0 ; trimGuessString[i] != ‘\0’ ; i++)

{

num = num * 10 + (trimGuessString[i] – ‘0’);

}

return num;

}

int main()

{

int num,guessNum,n,count=0;

char guessString[MAX_LEN];

char reply;

srand(time(NULL));

do

{

//產生一個隨即數

num=rand()%100+1;

printf(“你有10次機會,請猜數字並按回車。\n”);

for(n=1;n=10;n++)

{

// 以字符串形式讀入一個整數

gets(guessString);

/*

調用函數 transStringToNum 進行有效性驗證

當返回值 guessNum 是負數時,

字符串 guessString 中沒有合法的正數

*/

guessNum = transStringToNum(guessString);

if(guessNum == -1 )

{

printf(“請輸入一個數字(必須是在1-100 之間)!\n”);

n–;

continue;

}

if(guessNum == -2 )

{

printf(“輸入的不是一個合法數字(必須是在1-100 之間)!\n”);

n–;

continue;

}

if(guessNumnum)

{

printf(“It’s too high!\n”);

}

else if(guessNumnum)

{

printf(“It’s too low!\n”);

}

/*

這裡有誤,是 == 而不是 =

因為你剛好把這個分支放在最後,因此察覺不到錯誤

如果你寫成

if(guessNum = num) else if(guessNumnum) else if(guessNumnum)

就知道錯了。這時if(guessNum = num)永遠都會被執行

因為這是一個【賦值語句】而不是【邏輯語句】,且 num 的值是恆正的

*/

else if(guessNum == num)

{

printf(“You are right!\n”);

printf(“你共用了%d次機會猜對數字。\n”,n);

break;

}

}

printf(“Do you want to continue(Y/N or y/n)?”);

/*

用 getch() 取代scanf ,不易出錯

因為 getch()只能輸入一個字符

而 scanf 可以讀入多個字符,而且要回車

*/

fflush(stdin);

reply = getch();

}while((toupper(reply)==’Y’));

printf(“The game is over!\n”);

return 0;

}

/*

輸入合法數字示例(數字包含在一對””中):

“123”

” 123″

“123 “

” 123 “

” 0000123 ”

上面的結果都是輸入正數: 123

*/

關於C語言scanf遇到非法數據的問題?

輸入444時的回車遺留在輸入緩衝區里(因為scanf在%d控制下不接收回車符),被下面的scanf(“%c”,y);當作一個字符接收了(回車符也是字符啊),所以while還要循環,直接要求你輸入數據,但輸入的是字母不是數字,scanf(“%d”,…)不接收並留在輸入緩衝區里,被下面的scanf(“%c”,y);接收,while的()中不是0,所以printf就輸出了上次接收的444。如此往複。

把scanf(“%c”,y);改成scanf(” %c”,y);,即在%前加一個空格,把輸入444時遺留在輸入緩衝區里的’\n’吸收掉,就能等你輸入數據了。但由於y是char型,無論輸入什麼都不會是0,所以while循環不會停止。

正確改法是在scanf(“%c”,y);前加一句fflush(stdin);把輸入錯了數據從輸入緩衝區中統統清除,並把while(y);改成while(y!=’N’);,則當輸入N時程序就結束了。

c語言 非法輸入

這個數據驗證非常簡單,請看代碼:

/* 放到程序全局部分 */

#define PLUSH while (getchar() != ‘\n’)

/* 變量聲明 */

int input_result;

/* 數據輸入以及驗證 */

do {

input_result = scanf(“%d”,num);

if ((input_result != 1) || (num 11)) {

PLUSH;

printf(“您輸入的數據有誤,請重新輸入:”);

}

} while ((input_result != 1) || (num 11));

請用/* 數據輸入以及驗證 */的這段代碼替代您程序中的以下部分:

while(1)

{

printf(“請輸入您的選擇:\n”);

scanf(“%d”,num);

if(num=0num=11)

{

break;

}

else

printf(“您的選擇錯誤,請重新輸入:\n”);

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/159062.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-19 18:57
下一篇 2024-11-19 18:57

相關推薦

  • Python讀取CSV數據畫散點圖

    本文將從以下方面詳細闡述Python讀取CSV文件並畫出散點圖的方法: 一、CSV文件介紹 CSV(Comma-Separated Values)即逗號分隔值,是一種存儲表格數據的…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 如何用Python統計列表中各數據的方差和標準差

    本文將從多個方面闡述如何使用Python統計列表中各數據的方差和標準差, 並給出詳細的代碼示例。 一、什麼是方差和標準差 方差是衡量數據變異程度的統計指標,它是每個數據值和該數據值…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Python爬取公交數據

    本文將從以下幾個方面詳細闡述python爬取公交數據的方法: 一、準備工作 1、安裝相關庫 import requests from bs4 import BeautifulSou…

    編程 2025-04-29
  • Python兩張表數據匹配

    本篇文章將詳細闡述如何使用Python將兩張表格中的數據匹配。以下是具體的解決方法。 一、數據匹配的概念 在生活和工作中,我們常常需要對多組數據進行比對和匹配。在數據量較小的情況下…

    編程 2025-04-29
  • Python數據標準差標準化

    本文將為大家詳細講述Python中的數據標準差標準化,以及涉及到的相關知識。 一、什麼是數據標準差標準化 數據標準差標準化是數據處理中的一種方法,通過對數據進行標準差標準化可以將不…

    編程 2025-04-29

發表回復

登錄後才能評論