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

5cg8jx4n  于 2022-12-01  发布在  其他
关注(0)|答案(5)|浏览(260)

我是一个幼稚的程序员在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"};

我试着搜索了很多来得到答案,但是我找不到任何能帮助我的答案。在大多数线程中,人们都说要用向量而不是字符串数组。但是在这里,我得到的是字符串数组。

guicsvcw

guicsvcw1#

如果是普通数组,你必须将数组的大小传递给你的函数。没有其他的选择。但是,你可以使用vector<string>来使事情变得更简单...

f45qwnt8

f45qwnt82#

C++不支持任何确定数组大小的功能,除非它是在堆栈上分配的,其中可以使用sizeof。即使是堆栈分配的数组,它的大小也不能在它所传递到的函数中确定。
最好使用vectorlistarrayarray表示编译时定义的数组大小)。否则,通过某个结构体或其他变量自己保存计数。

gk7wooem

gk7wooem3#

大家说:
在大多数线程中,人们都说使用向量而不是字符串数组。但在这里,我得到的参数是字符串数组。
您可以更改作为参数接收的内容吗?请考虑以下替代方法:

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。

fafcakar

fafcakar4#

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)
在上面的main函数中,您应该这样调用它:

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

ugmeyewa5#

你可以对单个字符串做-myStr.length(),它会给你单个字符串的长度。myStr.length() - 1将是字符串的最后一个元素索引。
对于字符串数组的长度,已在Stack Overflow -Find the length of string array with strlen()上发布了答案
我使用-sizeof(myStrArray)/size(myStrArray[0])来获取字符串数组的长度(即元素的数量),它对我很有效。但是,如果myStrArray是用特定的链接作用域定义的,例如static或extern,你必须小心-这可能不会以同样的方式工作。另外,如果你使用指针,这将是没有帮助的(在@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;
}

此结果是否显示了您想要执行的操作?

相关问题