2012-10-18 30 views
0

讓我通過說我是C++的新手。用C++在正斜槓上分離輸入

我想抓住從得到在A/B的形式進入了一個分數的分子和分母(在命令行);讓A和B進入各自變量的最簡單方法是什麼?

+0

你能證明你已經試過了,所以我們可以在它上面工作嗎? – Grzegorz

回答

6

使用C++的最簡單的方法是將上述

double numerator, denominator; 
char dummy; 
if (in >> numerator >> dummy >> denominator) { 
    // ... 
} 

讀取來自一個流的合理值。要通過命令行參數獲取流,你會使用std::istringstream

int main(int ac, char* av[]) { 
    for (int i(1); i != ac; ++i) { 
     std::istringstream in(av[i]); 
     // ... 
    } 
} 

主要缺點是分隔符可以與上面提到的提取碼事情。爲了解決這個問題了,我會使用一個slash操縱:

std::istream& slash(std::istream& in) { 
    if (in.get() != '/') { 
     in.setstate(std::ios_base::failbit); 
    } 
    return in; 
} 
// ... 
if (in >> numerator >> slash >> denominator) { 
    // ... 
} 

由於該解決方案似乎可以理解的,我想指出的是,根據需要,你可能要稍微調整的slash()實現:在發佈的版本預計分子後面的斜線。它可以合理地跳過前導空白:

if ((in >> std::ws).get() != '/') { 
    ... 
} 

而且,這是一個字符一個特殊的執行,你可能希望有其他字符類似的操縱。爲了避免複製代碼,機械手可以成爲一個模板:

template <char Separator> 
std::istream& separator(std::istream& in) { 
    if ((in >> std::ws).get() != std::char_traits<char>::to_int_type(Separator) { 
     // ... 
} 
typedef std::istream& (*separator_manipulator)(std::istream&); 
separator_manipulator const slash = &separator<'/'>; 
separator_manipulator const comma = &separator<','>; 
// ... 

使用std::char_traits<char>::to_int_type()需要的是有使用具有負值char■當以避免出現問題。

+0

爲manilator示例+1,因爲op要求「在命令行中」 – Les

+0

@Les:關於命令行的好處:我添加了描述以及如何處理這個。 –

2

scanf。即使在C++中,它仍然有效。請注意,變量名稱應該以小寫字母開頭。

int a, b; 
scanf("%d/%d", &a, &b); 
-1

-Removed-By海報沒有用命令行完成答案。

分割字符串查找strtok的,一旦你從性病讀它像其他人證明。

+0

代碼被刪除後沒有太多剩餘。 –

0

命令行參數作爲C字符串傳遞(即字符指針)。如果你有一個程序的基本框架,你已經有...

void main(int argc, char * argv[]) 
{ ... } 

...或類似的東西。 argv數組的第一個成員(即argv [0])是一個字符指針,指向正在運行的程序的名稱。其餘的參數(argv [1] thru argv [argc-1])是命令行參數。

如果您只是在學習c/C++,那麼您應該在調試器下運行一個基本簡單的程序,通過不同的參數,引用任何帶空格的參數,使用環境變量作爲參數,以及試驗看看真正傳入的內容。

當你有這樣下來,用你的A/B作爲參數。它將是一個字符串而不是一個數字,所以你需要在「/」處進行分割。

int a, b; 
scanf("%d/%d", &a, &b); 

只要您的數字和斜槓都一起運行以生成一個參數,就會工作。 shell通常會用空格來分隔不同的參數。

您可以使用其他方法查找斜槓和值。你的問題的答案不一定是特定於C++。 Scanf適用於兩種c/C++。另一種簡單的方法是...

char *copyOfString = strdup(argv[1]); 
char *B = strchar(copyOfString, '/'); 
*B = NULL; 
B++; 
char *A = copyOfString; 

現在你有需要被轉換成整數的值的字符串形式(或浮動或雙,取決於您的要求)。當然,沒有錯誤檢查,所以如果你沒有完全正確地調用程序,程序化混亂將會隨之而來。

其他人已經發布了其他方法來做到這一點,但我希望這有助於和歡迎來到C/C++編程。請拿一本好書,試驗和錯誤到目前爲止,C/C++是非常無情的。