我想创建一个与Strlen一样的函数,我得到错误:“字符串下标超出范围”。我试着修理但不知道。
继承人代码:
#include "stdafx.h"
#include "stdafx.h"
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int strlen1( string str)
{
int count=0;
int i=0;
while (str[i]!='\0')
{
count++;
i++;
}
return count;
}
int _tmain(int argc, _TCHAR* argv[])
{
string input;
cin >> input;
cout << strlen1(input) << endl;
return 0;
}
谢谢!
答案 0 :(得分:4)
简而言之,对于非const
std::string
访问超出字符串长度的元素具有未定义的行为(更准确地说,使用非const
operator[]
时这一点)。
C ++ 98 §21.3.4/ 1 ,关于std::string::operator[]
:
如果
pos < size
,则返回data()[pos]
。否则,如果pos == size()
,const
版本将返回charT()
。否则行为未定义。
你的字符串是非const
。
你可以使它const
,然后在标准中调用一个特殊条款,保证元素 n 的结果为零,但这并没有解决你的函数完全无法解决的问题std::string
多余。
也许你的意思是让参数类型为char const*
。
这会更有意义,然后功能也会起作用。
干杯&amp;第h。,
答案 1 :(得分:3)
你似乎误以为std :: string与C风格的字符串(char const *)相同。这是不正确的。没有空终止符。
这是你的strlen函数唯一可行的方法:
int strlen1(string str) { return static_cast<int>(str.size()); }
答案 2 :(得分:1)
std::string
有一个很好的size()
方法。
答案 3 :(得分:0)
strlen基于零终止字符串(char *或char数组),C++ string基于长度+数据,你不能在字符串结束后访问数据(其中终端为零) )。除此之外,获取长度是C ++字符串(size())的标准属性,因此编写strlen的标准方法就是调用大小。