2016-09-03 86 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