簡體   English   中英

C++ 測試輸入是否為雙精度/字符

[英]C++ test if input is an double/char

我正在嘗試從用戶那里獲取輸入,並且需要知道一種讓程序識別輸入不是雙精度/字符的方法,這就是我現在所擁有的……但是當您輸入的輸入類型不正確時

1)雙重測試只是無限循環

2)即使輸入正確,字符也不會停止循環

int main () {
    double _double = 0;
    bool done = true;
while ( done ) {
    cout << "Please enter a DOUBLE:\n" << endl;
    cin >> _double;
    if ( _double > 0 ) { done = false; }
    if ( _double < 0 ) { cout << "\nthe number you entered was less than zero\nplease enter a valad number..." << endl; } 
    if(cin.fail()) { cin.clear(); }
}

done = false;
char _char = ' ';
while ( !done ) {
    cout << "Please enter a CHAR" << "\n";
    cout << "\t'y' = yes\n\t'n' = no" << endl;
    cin >> _char;
    if ( _char == 'y' || _char == 'n' ) { done = true; }
    if ( ! (_char == 'y' || _char == 'n') ) { cout << "\nyou have entered an invald symbol... \n" << endl; }
    if(cin.fail()) { cin.clear(); }
}

最好的辦法是始終將您的輸入讀取為字符串。 然后,您可以使用std::strtod()類的函數來測試並轉換為雙精度數。 檢查流是否失敗然后重置它們充其量是容易出錯的,並且不會給您產生好的錯誤消息的可能性。

例如:

string s;
cin >> s;
char * p;
double d = strtod( s.c_str(), & p );
if ( * p == 0 ) {
   cout << "Read double: " << d << endl;
}
else {
   cout << "Read string: " << s << endl;
}

指針“p”將指向第一個不能轉換為雙精度的字符。 您如何處理這實際上取決於您的應用程序的邏輯。

問題在於,當您讀取某些內容並且cin看到輸入永遠不會是雙精度值時,它會停止讀取,將未消耗的內容留在緩沖區中。 它會發出失敗的信號,你清除了它,但你不會吃掉cin沒有吃掉的剩余輸入。 因此,下次嘗試再次讀取相同的錯誤輸入時,再次......

char one 的問題是您必須按返回鍵才能使其處理大多數終端上的任何字符(例如,如果您讓程序從文件中讀取,則不會發生這種情況)。 因此,如果您按y則它不會退出 read 調用,直到您按下返回鍵。 但是,它通常會繼續並退出循環。

正如其他人所說,您最好閱讀整行,然后再決定要做什么。 您還可以使用 C++ 流而不是 C 函數檢查數字:

bool checkForDouble(std::string const& s) {
  std::istringstream ss(s);
  double d;
  return (ss >> d) && (ss >> std::ws).eof();
}

這將讀取任何初始雙數,然后讀取任何剩余的空格。 如果它隨后命中eof (文件/流的結尾),則表示該字符串僅包含一個雙精度值。

std::string line;
while(!getline(std::cin, line) || !checkForDouble(line)) 
  std::cout << "Please enter a double instead" << std::endl;

對於字符,您可以只測試長度 1

std::string line;
while(!getline(std::cin, line) || line.size() != 1) 
  std::cout << "Please enter a double instead" << std::endl;

如果你想讀的只有1字符,並盡快為字符鍵入了繼續,那么你將不得不使用的平台相關的功能(C ++不會將它們作為標准功能)。 例如,注意 windows 的conio.h文件,它具有_getch函數。 在 unix 系統上, ncurses提供了這樣的功能。

cin >> _double總是cin >> _double你一個double,無論他們輸入的是“42”、“0”還是“mary had a little lamb”。 您需要將用戶輸入讀取為字符串,然后測試該字符串以查看它是否為雙精度值。 如果 sscanf 無法將輸入字符串轉換為所需類型,它將返回 0:

cout << "Please enter a DOUBLE:\n" << endl;
    string s;
cin >> s;
    if( !sscanf(s.c_str(), "%lf", &_double) )
    {
        done = false;
        cout << "Not a number, sparky. Try again." << endl;
        continue;
    }

此外,像您這樣帶有前導下划線的標識符由語言保留。 不要養成像_double這樣命名的習慣——總有一天,它們可能不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM