簡體   English   中英

C ++ int或雙輸入

[英]C++ int or double input

我正在尋找清理一些已經運行的代碼。 首先,這是一個賦值,賦值指定整數必須作為整數,雙精度數等,否則我可能只是將輸入作為雙精度並轉換為int if(number%1==0)

我已經將代碼修剪為僅處理輸入(使用輸出語句來驗證它是否正常工作)。

int wholePart=0;
double decimalPart=0;
cout << "Input a number: ";
cin >> wholePart;
if(cin.peek() != '\n')
    cin >> decimalPart;

cout << "wholePart = " << wholePart << endl << "decimalPart = " << decimalPart << endl;

現在......這樣可以正常工作,並且在我添加代碼以處理組合整數和十進制(如果decimalPart不為0)之后,我已經完成了比賦值調用更多的工作,但我希望學習,我想盡可能地清理這段代碼。

我可以使用其他輸入驗證來包裝整個輸入部分,以確保用戶實際上輸入數字而不是字符。 但我最關心的是if(cin.peek() != '\\n')不夠好。 也許if(cin.peek() == '.')是一個更好的選擇,但我很好奇什么是最好的方式來完成我想在這里完成的事情。 有任何想法嗎?

請不要把它變成“哦它的功課”。 我想強調的是,我的課程已經超出了家庭作業的額外學分所要求的范圍。 我只是想了解更多關於語言的知識以及處理這種輸入的最佳方法。

我認為像"1.0"這樣的東西也應該被視為雙倍; 這幾乎消除了讀取double之類的內容,然后檢查它是否實際上是一個整數。

唯一的方法是解析數據,看看你是否遇到了可以被解釋為int東西。 如果您要使用流的轉換函數,這幾乎意味着掃描輸入兩次。 顯而易見的解決方案是將輸入放入字符串中; 這些更容易掃描多次。 如果你不允許這樣做,你可以使用istream::tellg記住位置,向前掃描,一旦你決定, istream::seekg回到你開始的地方。 但我不知道你的導師強加了什么規則。

如果你不能尋求,你可以嘗試手工黑客攻擊。 首先讀取一個int ,然后查看下一個字符。 如果它是'.' ,然后你可以讀一個double,它會給你小數部分,你可以將它添加到你已讀過的整數中。 如果它是'E''e' ,它會變得有點困難; 你可能需要前進,讀取一個int,並手動使用pow 但這遠非完美:如果雙重形式為"1.2E6" ,那么你最終會得到200000作為“分數”部分; 你需要一些方法來檢測它,並縮放你讀過的整數。 如果數字為".3" ,則在讀取整數時會出現錯誤:您可以事先檢查(但不要忘記"-.3" ),或者在執行任何其他操作之前重置錯誤。 當然,雙精度的整數部分可能不適合int (甚至long long )。

總而言之,對我來說似乎有點人為。 在實踐中,您將讀入一個字符串,並將正則表達式與其匹配,以確定您希望如何解釋它。

它可能更容易在整行中作為字符串讀取,檢查小數點然后將該行提供給字符串流,然后可以將其轉換為int或double(取決於小數點是否可用):

#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
  string line;
  int anInteger;
  double aDouble;

  getline( cin, line );
  stringstream ss( line );
  if ( line.find( '.' ) == string::npos ) {
    ss >> anInteger;
  } else {
    ss >> aDouble;
  }

  return 0;
}

根據你的規范,我會讀取一個std::string ,看看是否可能是一個整數以外的東西,取決於結果解析為intdouble 例如

int         integer;
double      number;
std::string value;
if (std::cin >> value) {
    if (value.find_first_of(".Ee")) {
        if (std::istringstream(value) >> number) {
            std::cout << "read double=" << number << '\n';
        }
        else {
            std::cout << "failed to read double from '" << value << "'\n";
        }
    }
    else {
        if (std::istringstream(value) >> integer) {
            std::cout << "read integer=" << integer << '\n';
        }
        else {
            std::cout << "failed to read integer from '" << value << "'\n";
        }
}

暫無
暫無

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

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