如何从字符数组中提取最多一个空格的字符串?(C++)

如何从字符数组中提取最多一个空格的字符串?(C++),c++,string,char,C++,String,Char,我有一个字符数组,传递给这个函数,从文件中读入。它们看起来像这样: 7270706PRRío Cañas Abajo 1185 0.238885 18.037675 -66.46701029126 2.6966 我想从这个char数组的第9个位置提取表示一个地方名称的char,直到空间流,所以在本例中是Canas Abajo。为了做到这一点,我试着用a=9和stop=40呼叫: string getPlaceNa

我有一个字符数组,传递给这个函数,从文件中读入。它们看起来像这样:

7270706PRRío Cañas Abajo                                   1185    0.238885 18.037675 -66.46701029126  2.6966
我想从这个char数组的第9个位置提取表示一个地方名称的char,直到空间流,所以在本例中是Canas Abajo。为了做到这一点,我试着用a=9和stop=40呼叫:

   string getPlaceName(const char (&in) [110], int a, int stop){ 
   char ext[48];
   int p =0; int sig = 0;
   string toret;
   for(a, p; a < stop; a+=1, p+=1)
       ext[p] = in[a];
   char * v = strtok(ext, " ");

   while (v) {
    if(sig == 0)
        {string q = (v); toret = q; sig= 1;}
    else
        {string l = (v); toret = toret +" " +l;}  
    v = strtok(NULL, " ");
  }
   cout<<"|"<<toret<<"|"<<endl;
   return toret;
}

这适用于我试图提取的字符串的最后一个字母位于行尾的文件,但在给定的示例字符串中,它在名称后返回一个混乱的随机字符,这意味着没有正确的空终止。这在有或没有字符串q=v和字符串l=v的情况下都会发生。我尝试组合字符串并返回时出现了什么问题

将字符串标记化,使用strtok。您还可以使用std::string::find方法。您还可以使用std::copy算法。流迭代器用于将流作为空格分隔的字符串复制到向量

使用string::substr从-to位置提取子字符串

char myString[] = "7270706PRRío Cañas Abajo                                   1185    0.238885 18.037675 -66.46701029126  2.6966";
char *p = strtok(myString, " ");
while (p) {
    printf ("Token: %s\n", p);
    p = strtok(NULL, " ");
}


我以前使用过一种方法:

std::vector<std::string> Split(const std::string& text, const char separator)
{
    std::vector<std::string> tokens;
    int start = 0;
    int end = 0;

    while ((end = text.find(separator, start)) != std::string::npos) 
    {
        tokens.push_back(text.substr(start, end - start));

        start = end + 1;
    }

    tokens.push_back(text.substr(start));

    return tokens;
}

使用此项获取令牌列表,然后选择第一个和第二个索引。

标记字符串,使用strok。您也可以使用std::string::find方法。我尝试创建一个字符串来添加标记化后的char*p,这样我就可以将Canas Abajo作为一个字符串返回,它似乎无法正确地在函数中使用,但是当我返回这个字符串时,我似乎变得更加疯狂。你知道为什么吗?首先修复getPlaceName,函数impl。不必要地过于复杂。你所需要做的就是,阅读这行代码,标记它,参考我答案中的各种方法,找出名称并返回它。我已经在示例中更新了我的代码。我返回名称的方法不正确吗?我不理解逻辑,但我建议您通过引用传递toret,不要返回字符串值。查看是否有任何变化。如果有任何变化,超过200个ascii字符的变化增加了约5%,仍然会出现断字符串。
std::vector<std::string> Split(const std::string& text, const char separator)
{
    std::vector<std::string> tokens;
    int start = 0;
    int end = 0;

    while ((end = text.find(separator, start)) != std::string::npos) 
    {
        tokens.push_back(text.substr(start, end - start));

        start = end + 1;
    }

    tokens.push_back(text.substr(start));

    return tokens;
}