2016-09-03 72 views
2

這是在C++(Eclipse Mars,如果它很重要,編譯器MinGW)。比方說,我想一個字符串分割成兩個字符串的字符,並使用功能:如何從函數內部修改範圍變量?

int strParse(const string& a) { 
    // parse line read input 
    int b = a.find("-"); 
    firstsplit = a.substr(0, b); 
    secsplit = a.substr(b + 1); 
    return 0; 
} 

但我想定義firstsplitsecsplit不是作爲全局變量但main()範圍之內,他們'使用了。當它們在那裏定義時,它們不能用於該功能中,但我需要該功能來定義它們以用於部分main

+0

@爲什麼如果你定義'main'中的變量不能在函數中使用(暗示你將它們當作參數傳遞)? – KostasRim

+0

您可能需要將字符串傳遞到函數中,以便您可以填充它們,或者您需要將它們從函數中傳遞出來,形成一對。 – NathanOliver

回答

9

你當然可以在main()中定義它們並通過引用傳遞它們。但這是sl。。

如果你要分析這種情況,firstsplitsecsplit是你的函數計算。

因此,你的函數應該做的是返回這些值。這是一個函數的功能:它計算一些東西並返回它。

這樣做的一種方法是簡單地返回std::pair

std::pair<std::string, std::string> strParse(const string& a) { //parse line read input 
    int b = a.find("-"); 
    std::string firstsplit = a.substr(0, b); 
    std::string secsplit = a.substr(b + 1); 
    return std::make_pair(firstsplit, secsplit); 
} 

但是,這將導致更多的工作,更重寫,如果你的功能可能還需要返回別的東西,或其他一些替代性的結果,如錯誤指示。

最靈活的做法,是由函數返回一個類:

class parse_results { 

public: 

    std::string firstsplit; 
    std::string secsplit; 
}; 

parse_results strParse(const string& a) { //parse line read input 
    parse_results ret; 

    int b = a.find("-"); 
    ret.firstsplit = a.substr(0, b); 
    ret.secsplit = a.substr(b + 1); 
    return ret; 
} 

然後,如果你需要有什麼樣的位置返回更多的信息,這可以簡單地添加到parse_results類。

+0

這樣一個很好的例子(upvoted)。就個人而言,我會使用'vector '作爲返回類型,因爲他可能會返回超過2個字符串。 – KostasRim

+2

@KostasRim我不會。按照或者如果OP使用'std :: tuple'將允許它們在C++ 17中出現時使用結構化綁定。 – NathanOliver

+0

@NathanOliver我不熟悉C++ 17的新增內容,謝謝指出。 – KostasRim

0

嘗試 INT strParse(常量字符串&一個,串& firstsplit,串& secsplit)

+2

不知道爲什麼'downvote'就此。但我想這是因爲缺乏expnation。 – sjsam

+5

@sjsam沒有解釋和糟糕的格式看起來像投票的好理由。(不是羽絨投票人) – NathanOliver

1

我建議你在聲明主要兩個std::string,然後將它們作爲參數傳遞給函數。如果這不是您正在尋找的行爲,則可以改爲使函數返回std::vector<string>

我想指出string::find()方法返回size_t而不是int。如果您不確定某種類型,則始終可以使用auto

0

你的int返回值是無用的;它始終爲0.相反,只需返回兩個元素中的兩個字符串structstd::array