2011-10-11 53 views
0

我已經寫了小C++控制檯應用程序,這是源代碼:整數驗證在C++

#include<stdio.h> 
#include<locale.h> 
#include<ctype.h> 
#include<stdlib.h> 

void main() 
{ 
    setlocale(LC_ALL, "turkish"); 
    int a,b,c,d; 

    printf("first number: "); 
    scanf("%d", &a); 

    printf("second number: "); 
    scanf("%d", &b); 

    c = a+b; 

    printf("Sum: : %d\n", c); 
} 

正如你可以看到我正在請求來自用戶的兩個數字,不是對它們求和。但是我想添加一個控件,其中檢查用戶輸入的數字是整數嗎?

我會檢查用戶輸入的數字,如果數字不是一個整數,我會回顯一個錯誤。我在每scanf之後使用此功能,但效果不佳。

if(!isdigit(a)) 
{ 
      printf("Invalid Char !"); 
      exit(1); 
} 

簡而言之,在scanf操作上,如果用戶鍵入「a」,它將產生一個錯誤消息並且程序停止工作。如果用戶輸入一個號碼程序將繼續

+1

我重新標記此爲C,因爲我什麼也沒看到C++它,它會幫助你更好的答案。 –

+0

自10分鐘前我在學習C++,哈哈!我們的教授這樣寫道。我複製它。 – Eray

+2

@Eray它不是'無效主',它從來沒有,也永遠不會。它是'int main',儘管'return'語句在'main'中是可選的(但是這是唯一的非''void'函數,它們是可選的)。 –

回答

7

scanf爲您做了驗證。只需檢查scanf的返回值即可。

printf("first number: "); 
if(scanf("%d", &a) != 1) { 
    printf("Bad input\n"); 
    return 1; 
} 

printf("second number: "); 
if(scanf("%d", &b) != 1) { 
    printf("Bad input\n"); 
    return 1; 
} 
+0

但我無法自定義錯誤。 – Eray

+1

我不知道你的意思是「我無法自定義錯誤。」當scanf失敗時,你當然可以打印你想要的任何錯誤信息,對嗎? –

+0

是的我的意思是*錯誤信息*對於錯字抱歉。現在你的回答非常好,真的幫了我很大的忙。謝謝 ! – Eray

1

isdigitchar作爲參數。

如果呼叫scanf成功,則保證您有一個整數。

scanf也有一個返回值,表示它讀取了多少個值。

您想檢查scanf的返回值是否爲1。

參見:http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

+0

但是,例如,我爲第一個數字輸入了「A」,並且它正在跳過第二個數字,而不是直接寫入,SUM:-1717986920' – Eray

+2

這是因爲第一個'scanf'嘗試讀取「A」並失敗,返回0.由於緩衝區中仍有輸入,下一個'scanf'立即嘗試做同樣的事情,失敗並返回'0'。嘗試Rob的答案 - 我認爲你會明白當你做什麼時會發生什麼。 –

2

C++的方式做,這將是

#include <iostream> 
#include <locale> 

int main() 
{ 
    std::locale::global(std::locale("nl_NL.utf8")); // tr_TR doesn't exist on my system 

    std::cout << "first number: "; 

    int a; 
    if (!(std::cin >> a)) 
    { 
     std::cerr << "whoops" << std::endl; 
     return 255; 
    } 

    std::cout << "second number: "; 

    int b; 
    if (!(std::cin >> b)) 
    { 
     std::cerr << "whoops" << std::endl; 
     return 255; 
    } 

    int c = a+b; 

    std::cout << "Sum: " << c << std::endl; 

    return 0; 
} 
+0

你一定是在開玩笑:S我聽到這些第一次('std :: locale :: global(),cin,cout等......) – Eray

+0

scanf,printf,setlocale在ANSI C領域都是穩固的: ) – sehe

+0

我不知道它是什麼:)我正在從事網絡開發(PHP)4年,但我從未與C,C++合作過 – Eray