【问题标题】:How to get last index of a string array in C++如何在 C++ 中获取字符串数组的最后一个索引
【发布时间】:2014-11-13 08:10:17
【问题描述】:

我是 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"};

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

【问题讨论】:

  • 添加数组长度作为函数的第二个参数
  • 你可以使用std::array<std::string, n>,它有一个size方法。
  • 如果你想学习 C++,请使用 std::vector 而不是 C 数组 []。如果您想学习 C,请不要使用 std::string。如果你想在标准库中使用 C++。

标签: c++ arrays


【解决方案1】:

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

【讨论】:

  • 没有其他适合初学者的选项,但还有其他选择:template <size_t N> int fun1(string (&members)[N]) { ...use N here... }。您还可以使用哨兵值 - 例如一个空的std::string
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    你说:

    在大多数线程中,人们都说使用向量而不是字符串数组。但是在这里我将参数作为字符串数组。

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

    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。

    【讨论】:

      【解决方案4】:

      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);
      

      【讨论】:

        【解决方案5】:

        您可以对单个字符串执行此操作 - 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;
        }
        

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

        【讨论】:

        • @ErikAlapää OP 是否说他对 C 风格的解决方案感兴趣?从这里的问题来看,C 应用程序在哪里发挥作用?
        • 否,但以 '\0' 结尾的字符串是 C 风格的。并且称它为字符串数组令人困惑,字符串数组类似于std::string string_arr[10],很少使用...
        • 请注意这个sizeofmalarkey 仅适用于阵列本身。如果你在函数中尝试它,你只有一个指针,你会得到错误的值和奇怪的运行时行为。
        • @MikeSeymour +1 提醒。建议 OP 使用 vector,但他坚持认为应该有另一种方法(不一定是更好的方法)。
        猜你喜欢
        • 1970-01-01
        • 2023-02-16
        • 2016-02-16
        • 2021-07-18
        • 2019-05-28
        • 2014-05-09
        • 1970-01-01
        • 1970-01-01
        • 2011-07-07
        相关资源
        最近更新 更多