Как получить последний индекс массива строк в C ++

0

Я наивный программист в 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"};

Я пытался найти много ответов, но я не мог найти ответа, который может помочь. В большинстве потоков ребята говорят использовать вектор вместо строкового массива. Но здесь я получаю аргумент как строковый массив.

  • 1
    Добавьте длину массива в качестве второго параметра для вашей функции
  • 2
    Вы можете использовать std::array<std::string, n> , который будет иметь метод size .
Показать ещё 1 комментарий
Теги:
arrays

5 ответов

1

В случае простого массива вам нужно передать размер массива в вашу функцию. Другого выбора нет. Однако вы можете использовать vector<string> чтобы упростить работу...

  • 4
    Для новичка нет другого хорошего варианта, но есть и другие варианты: template <size_t N> int fun1(string (&members)[N]) { ...use N here... } . Вы также можете использовать значение Sentinel - например, пустую std::string .
0

Ты говоришь:

В большинстве потоков ребята говорят использовать вектор вместо строкового массива. Но здесь я получаю аргумент как строковый массив.

Можете ли вы изменить то, что получаете в качестве аргументов? Рассмотрим эти альтернативы:

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.

0

C++ не поддерживает какую-либо функцию для определения размера массива, если она не выделена в стеке, где sizeof может использоваться. Даже с распределенным массивом стека его размер не может быть определен в функции, которой он передан.

Вам лучше использовать vector, list или array (array для размера массива, определенного временем компиляции). В противном случае сохраните счет самостоятельно через какую-либо структуру или другие переменные.

0

Вы можете сделать для отдельной строки - myStr.length() это даст вам длину вашей отдельной строки. myStr.length() - 1 будет вашим последним индексом элемента для строки.

Для длины массива строк ответ уже отправлен в Qaru - найдите длину массива строк с помощью strlen()

Я использую this - sizeof(myStrArray)/size(myStrArray[0]) чтобы получить длину массива строк (то есть количество элементов), и он работает для меня. Однако вы должны быть осторожны, если myStrArray определен с определенными областями привязки, например, static или extern - это может работать не так. Кроме того, если вы используете указатели, это не будет полезно (editd после @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;
}

Получает ли этот результат то, что вы хотели сделать?

  • 0
    @ ErikAlapää OP говорит, что он интересуется решением в стиле C? От вопроса здесь, где приложение C входит в игру?
  • 0
    Нет, но строка с \ 0 завершается в C-стиле. И называть его строковым массивом сбивает с толку, строковый массив - это что-то вроде std :: string string_arr [10], который редко используется ...
Показать ещё 2 комментария
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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню