我需要在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()
答案 0 :(得分:3)
您可以使用std::string::find_first_of
/ std::string::find_last_of
和std::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::getline
与std::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;
}