必须在C ++中为strchr使用c_str?

时间:2018-08-09 13:23:02

标签: c++

我需要在c ++ #object type class(Split_data) [1] "list" #first list Split_data[[1]] # Value Year Category #1 1 2010 X #2 2 2011 X #3 3 2012 X #first list and first column Split_data[[1]][,1] #[1] 1 2 3 #first list and first line Split_data[[1]][1,] # Value Year Category #1 1 2010 X #first list, first line and first column Split_data[[1]][1,1] #[1] 1 中解析std::string

我只需要std::string s = "my_prefix,my_body,my_suffix";。在C中(使用类似的prefix, suffix作为输入),我会做类似的事情:

char*

我想在C ++中使用char *s = "my_prefix,my_body,my_suffix"; size_t N = strlen("my_prefix"); // This is actually a fixed length in my real case char* suffix = 1 + strrchr(s, ','); char* prefix[128]; snprintf(prefix, N+1, "%s", s); printf("prefix = %s\n" "suffix = %s\n", prefix, suffix); ,但是从我看来,implementation仅适用于strchr。我必须在字符串上使用char*还是其他方法(例如C ++函数[不是boost,等等...我使用的是非常精简的C ++])?

编辑:

这是我在C ++中的尝试,这是一个很好的选择吗?

c_str()

3 个答案:

答案 0 :(得分:3)

您可以使用std::string::find_first_of / std::string::find_last_ofstd::string::substr来代替strchr,而从s中获取前缀和后缀。

std::string s = "my_prefix,my_body,my_suffix";
std::string prefix = s.substr(0, s.find_first_of(","));
std::string suffix = s.substr(s.find_last_of(",") + 1);

答案 1 :(得分:1)

首先,即使在C语言中,使用strchr解析标记化的字符串也不是一件好事。 strtok系列功能提供了更好的选择。

在C ++世界中,有几种方法可以实现C ++惯用的令牌解析。对我来说,纯标准的方式似乎是将std::getlinestd::stringstream一起使用。

示例:

std::istringstream str("This is my,rifle,this is my gun");
std::string token;
while (std::getline(str, token, ',')) {
    // work with next token
}

Boost还提供令牌化解决方案:Boost.Split和Boost.Tokenizer,它们比getline支持的解析更灵活,功能更丰富。

答案 2 :(得分:-1)

C ++等效项可能是:

#include <string>
#include <iostream>

int main() {
    std::string s = "my_prefix,my_body,my_suffix";
    std::string::size_type i = s.find(',');
    std::string::size_type j = s.rfind(',');
    std::cout << "Prefix:" << s.substr(0,i) << std::endl << "Suffix:" << s.substr(j+1) << std::endl;
}