如何在C ++中获取字符串数组的最后一个索引

时间:2014-11-13 08:10:18

标签: c++ arrays

我是c ++的天真程序员,刚开始通过解决问题来学习c ++。 如果有任何旧链接或来源我可以得到以下问题的答案,请告诉我。

我有字符串数组,我需要解析它直到最后一个元素,但我不知道我将检查循环到达数组中的最后一个元素的条件。

例如

int fun1(string members[]){
    int i=0;
     for(i=0;END_CONDITION;i++){
         /*Do some work*/
     }
}

会员就是这样的

 string members[] = 
 {"BETTY F M A A C C",
  "TOM M F A D C A",
  "SUE F M D D D D",
  "ELLEN F M A A C A",
  "JOE M F A A C A",
  "ED M F A D D A",
  "SALLY F M C D A B",
  "MARGE F M A A C C"};

我试图搜索很多以获得答案,但我找不到任何可以帮助的答案。 在大多数线程中,人们都说使用向量而不是字符串数组。但在这里我得到的参数是字符串数组。

5 个答案:

答案 0 :(得分:1)

如果是普通数组,则必须将数组大小传递给函数。没有其他选择。但是,您可以使用vector<string>来简化操作......

答案 1 :(得分:0)

您可以为单个字符串执行 - myStr.length()它会为您提供单个字符串的长度。 myStr.length() - 1将是字符串的最后一个元素索引。

对于字符串数组的长度,答案已经在Stack Overflow上发布 - Find the length of string array with strlen()

我使用它 - sizeof(myStrArray)/size(myStrArray[0])来获取字符串数组的长度(即元素数量),它对我有用。但是,如果使用特定的链接范围定义myStrArray,则必须小心,例如静态或外部 - 这可能不会以相同的方式工作。另外,如果你使用指针,这将没有用(在@MikeSeymour评论答案后编辑)。

这应该对你有所帮助。另一个选项是创建一个向量并将每个字符串元素存储在向量中,你应该得到索引。 myVector.size()会给你号码。你的字符串向量中的元素,你可以找出哪个是基于0的索引的最后一个元素索引:)

#include <iostream>
using namespace std;

int main() {
    std::string s[] =  
 {"BETTY F M A A C C",
  "TOM M F A D C A",
  "SUE F M D D D D",
  "ELLEN F M A A C A",
  "JOE M F A A C A",
  "ED M F A D D A",
  "SALLY F M C D A B",
  "MARGE F M A A C C"};
  size_t myStrArrLen = 0;

  myStrArrLen = sizeof(s)/sizeof(s[0]);

  cout <<  myStrArrLen << endl;
  cout << s[myStrArrLen - 1].length() << std::endl;

  return 0;
}

这个结果是否表明你想做什么?

答案 2 :(得分:0)

C ++不支持任何确定数组大小的功能,除非它在堆栈上分配,可以使用sizeof。即使使用堆栈分配的数组,也无法在传递它的函数中确定其大小。

最好使用vectorlistarrayarray作为编译时定义的数组大小)。否则,通过一些结构或其他变量自己保留计数。

答案 3 :(得分:0)

sizeof(string)未根据string::length进行更改。

这就是为什么你可以使用sizeof(members)/sizeof(string)

完整的解决方案:

int main()
{
     string members[] =
     {"BETTY F M A A C C",
      "TOM M F A D C A",
      "SUE F M D D D D",
      "ELLEN F M A A C A",
      "JOE M F A A C A",
      "ED M F A D D A",
      "SALLY F M C D A B",
      "MARGE F M A A C C"};

     cout<<sizeof(members)/sizeof(string)<<endl;
}

这将给出输出:8

在函数内部你不能这样做,因为在:

int fun1(string members[]){
   cout<<sizeof(members)<<endl;
}

你会得到一个指针的大小,而不是你在上面的例子中得到的大小。

所以你应该为你的函数添加大小:

int fun1(string members[], size_t size)

从上面的主要功能中你应该这样称呼它:

size_t size = sizeof(members)/sizeof(string);
fun1(members,size);

答案 4 :(得分:0)

你说:

  

在大多数线程中,人们都在说使用vector而不是string数组。但在这里我得到的参数是字符串数组。

你可以改变你收到的作为参数吗?考虑以下替代方案:

int fun1(string members[], std::size_t length){
    for(std::size_t i=0; i < length; i++) {
        /*Do some work*/
    }
}
string members[] = 
{ "BETTY F M A A C C", // ...
  "MARGE F M A A C C" };
fun1(members, 2);

或者:

template<typename I>
int fun1(I begin, const I& end) {
    for(; begin != end; ++begin)
        /* Do some work with (*begin) */
    }
}
fun1(std::begin(members), std::end(members));

或者:

int fun1(const std::vector<std::string>& members)
    for(const auto& s: members) {
        // on n-th iteration, s is a const reference to n-th element
    }
}

std::vector<std::string> members = 
{ "BETTY F M A A C C", // ...
  "MARGE F M A A C C" };
fun1(members);

或者与上一个示例相同,使用std :: array而不是std :: vector。