我是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"};
我试图搜索很多以获得答案,但我找不到任何可以帮助的答案。 在大多数线程中,人们都说使用向量而不是字符串数组。但在这里我得到的参数是字符串数组。
答案 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
。即使使用堆栈分配的数组,也无法在传递它的函数中确定其大小。
最好使用vector
,list
或array
(array
作为编译时定义的数组大小)。否则,通过一些结构或其他变量自己保留计数。
答案 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。