![](/img/trans.png)
[英]what is stored in the input buffer if I provide double for an int in c++?
[英]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
,看看是否可能是一個整數以外的東西,取決於結果解析為int
或double
。 例如
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.