Я наивный программист в 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"};
Я пытался найти много ответов, но я не мог найти ответа, который может помочь. В большинстве потоков ребята говорят использовать вектор вместо строкового массива. Но здесь я получаю аргумент как строковый массив.
В случае простого массива вам нужно передать размер массива в вашу функцию. Другого выбора нет. Однако вы можете использовать vector<string>
чтобы упростить работу...
template <size_t N> int fun1(string (&members)[N]) { ...use N here... }
. Вы также можете использовать значение Sentinel - например, пустую std::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.
C++ не поддерживает какую-либо функцию для определения размера массива, если она не выделена в стеке, где sizeof
может использоваться. Даже с распределенным массивом стека его размер не может быть определен в функции, которой он передан.
Вам лучше использовать vector
, list
или array
(array
для размера массива, определенного временем компиляции). В противном случае сохраните счет самостоятельно через какую-либо структуру или другие переменные.
Вы можете сделать для отдельной строки - 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;
}
Получает ли этот результат то, что вы хотели сделать?
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);
std::array<std::string, n>
, который будет иметь методsize
.