2014-01-17 211 views
1

這是一個C++相關的問題。 我需要製作一個讀取用戶體重/身高的程序。這一切都很好,並且很棒,但是我遇到了一個問題。C++英尺/英寸

用戶需要能夠輸入一個數字,然後輸入一個測量單位。這可以以英尺/英寸,米或釐米爲單位。我得到了所有的工作,但用戶也應該能夠寫一些東西,如5',並有可選的英寸。 繼承人問題即時通訊: 我有兩個變量即時通訊使用用戶輸入,一個雙(高度)和一個字符串(unitHeight)。這對於m和cm都很好,但對於英尺/英寸我需要再加兩個,因爲用戶需要輸入兩個字符串和兩個數字(爲簡單起見,我將它保留爲雙打) 所以我使用if語句:

if (unitHeight == "'"){ 
    cin >> height2; 
    cin >> unitHeight2; 
} 

現在唯一存在的問題是我需要這樣做,以便當用戶輸入x'(x是任意數字) 該程序不要求任何進一步的輸入。 這可能是顯而易見的,我可能只需要退後一步,但我一直在考慮這一段時間,並且我個人無法弄清楚它

任何幫助表示讚賞。

+6

你應該得到整條線並解析它。用一個實際的行,你可以檢查接下來的兩個標記是否是一個數字,並且「 – chris

+1

如果你在'5''後面停下來,怎麼會有人進入'5'2''? –

+0

我不認爲你可以比較一個「」塊。 – BWG

回答

2

做什麼取決於可能提出什麼其他的輸入(如果有的話)的高度後,你希望如何處理錯誤,但讓你開始有點:

int height2 = 0; 
if (unitHeight == "'" && cin >> height2) 
{ 
    if (!(cin >> unitHeight2)) 
    { 
     std::cerr << "hey, " << height2 << " what? give me units baby!\n"; 
     exit(EXIT_FAILURE); 
    } 
    // if we get here, then we have height2 and unitHeight2 to work with... 
    ... 

} 
else if (cin.eof()) 
{ 
    // might have hit EOF without inches, that could be legal - depends on your program 
    ... 
} 
else 
{ 
    // saw some non-numeric input when expecting height2 - is that ok? 
    ... 
} 

既然你貼,你我們添加了一條評論,表示您特別希望在一行中輸入此信息,之後用戶可以按回車。要處理該問題,請使用std::string line; if (getline(std::cin, line)) { std::istringstream iss(line); >>above code goes here<< } else { ...couldn't read a line of input...}圍繞上述代碼。

另外,你說:

用戶需要能夠輸入一個數字,然後之後的測量單位。這可以以英尺/英寸,米或釐米爲單位。我得到了所有的工作

...我希望如此,但請注意,它是有點棘手, 5'11「and 180cm,as cin >> height1 >> unitHeight1,then unitHeight1 is std::string,will read」'11「。如果您製作unitHeight1 a char,那麼它會傾向於從」cm「讀取」c「,所以這兩種類型都不適用於。這兩種寫法你最好讀一個字符然後用它來決定是否讀另一個....

+0

等待。我是一種C++ nooby在這裏。比較unitHeight對'''「'去工作?我認爲''」'返回指針的數據對於那個字符串(字符)。或者我誤解了一些東西? – BWG

+0

我已經拼湊了我所有不同類型的單元的方式是我有一個double(高度)和一個字符串(unitHeight),用戶輸入說200釐米或1.5米或5.8英尺,所有這些然後在方法中檢查並最終轉換成米,因爲這就是即時通訊工具進行進一步計算。 用戶也可以輸入5'7「例如 我的方式這個,我上面解釋過,如果,一個d如果unitHeight是'那麼它允許另一個雙精度和另一個字符串輸入是英寸和雙引號。 我只需要弄清楚如何讓用戶不需要輸入英寸。 –

+0

@BWG:在C++中,'std :: string'變量可以直觀地(即用'==','!=','<等等)與字符串文字進行比較(即雙引號ASCIIZ類型數組的文本常量這是因爲'std :: string'實例化了一個模板類,它有一個「用戶定義的」(標準庫提供的)'operator ==',它接受一個' const char *'作爲右手邊的參數,但知道在內部執行'strcmp()'-ish操作。 –

0

你可以做這樣的事情:

string height; 
cin >> height; 

for(int i = 0; i < height.size(); i++) { 
    if(height[i] == "'"[0]) { 
     cout << "It's ok!" << endl; 
     break; 
    } 
} 
+0

爲什麼?據我所知,沒有什麼我需要它。 –

+0

此代碼將識別您何時會擁有「'」。所以,你會知道,在它之後,你會有英寸(忘記那個「休息」)。 –

+0

感謝您的輸入,但我不需要for循環。我知道一個事實,即輸入將是double,string,double,string(他們只是真正的整數,但我保留它們作爲後來需要的計算的雙打,並且我不喜歡類型轉換)問題I我的意思是,用戶需要能夠做到5'7「或只是簡單的5',然後按回車鍵,不會要求輸入英寸值 –

0

同時讀取標準輸入一行。處理每一行,如果一行包含第二個數字(對於高度)和第二個字符串(對於單位),那麼你有英尺+英寸規格,否則你只有一個數字和一個單位。

const int maxLength = 200; 
while (true) 
{ 
    char line[maxLength+1]; 
    std::cin.getline(line, maxLength); 
    if (!cin.good()) 
    { 
     break; 
    } 

    std::istringstream str(line); 
    double height1; 
    std::string unit1; 
    double height2; 
    std::string unit2; 
    bool secondHeightFound = false; 
    str >> height1 >> unit1 >> height2; 
    if (str.good()) 
    { 
     str >> unit2; 
     secondHeightFound = true; 
    } 
} 
相關問題