Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数,它将像一个斯特林C++_C++_Strlen - Fatal编程技术网

函数,它将像一个斯特林C++

函数,它将像一个斯特林C++,c++,strlen,C++,Strlen,我想做一个和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=

我想做一个和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;
}

谢谢

strlen基于以零结尾的字符串char*,或char数组,基于长度+数据,您无法访问字符串结尾后的数据,而该字符串的结尾处将是零。除此之外,获得长度是C++字符串大小的标准属性,因此编写STRLLN的标准方法只是调用大小。

基于零结尾字符串char或char数组,基于长度+数据,在字符串的结尾处,如果终端为零,则不能访问数据。除此之外,获得长度是C++字符串大小的标准属性,因此编写StrLin的标准方法就是调用String。

STD::String有一个很好的尺寸方法。

STD::String有一个很好的尺寸方法。

< p>您似乎误解了STD::String与C风格字符串char const *相同。这根本不是事实。没有空终止符

以下是strlen函数的唯一工作方式:

int strlen1(string str) { return static_cast<int>(str.size()); }

您似乎误解了std::string与C样式的字符串char-const*相同。这根本不是事实。没有空终止符

以下是strlen函数的唯一工作方式:

int strlen1(string str) { return static_cast<int>(str.size()); }
简言之,对于非常量std::string,在使用非常量运算符[]访问字符串长度以外的元素时,其行为更精确地说是未定义的

C++98§21.3.4/1,关于std::string::operator[]:

如果pos<大小,则返回数据[pos]。否则,如果pos==size,const版本将返回图表。否则,行为是未定义的

你的字符串是非常量的

您可以将其设置为const,然后调用标准中的一个特殊规定,该规定保证元素n的结果为零,但这并不能解决函数对于std::string是完全冗余的问题

也许您的意思是参数类型为char const*

这会更有意义,然后该功能也会工作

简而言之,对于非常量std::string,当使用非常量运算符[]时,访问字符串长度以外的元素具有更精确的未定义行为

C++98§21.3.4/1,关于std::string::operator[]:

如果pos<大小,则返回数据[pos]。否则,如果pos==size,const版本将返回图表。否则,行为是未定义的

你的字符串是非常量的

您可以将其设置为const,然后调用标准中的一个特殊规定,该规定保证元素n的结果为零,但这并不能解决函数对于std::string是完全冗余的问题

也许您的意思是参数类型为char const*

这会更有意义,然后该功能也会工作


Cheers&hth.,

c++字符串可以,但不必以null结尾;i++;?你只需要一个。。。但这不是问题所在……您看过std::string文档吗?int i;fori=0;i@PigBen:str=string42,“\0”;C++字符串可以,但不必是null结尾。i++;?你只需要一个。。。但这不是问题所在……您看过std::string文档吗?int i;fori=0;i@PigBen:str=string42,“\0”;实际上,对于长度为n的常量std::string,访问超出字符串长度的元素n需要生成'\0'。这是标准中的特殊情况规定。因此,如果OP只是在形式参数类型中添加了一点常量,strlen1函数在技术上就可以了。什么是sero-teminated字符串?你认为我怎样才能自己创建strlen函数?@Aviran:我的意思是创建一个基于std::string作为输入的strlen函数可能是我听说过的最愚蠢的事情之一。如果是一些家庭作业,你应该考虑找一个更好的老师。”阿尔夫·P·斯坦巴赫:从技术上说,好的,你可以这么说,而且有很多方法可以做同样的事情,而不需要坚持。但我同意对于strlen这样的函数,使参数const看起来合乎逻辑,我不喜欢允许破坏原始字符串的strlen来计算长度。实际上,对于长度为n的常量std::string,需要访问超出字符串长度的元素n才能生成“\0”。这是标准中的特殊情况规定。因此,如果OP只是在形式参数类型中添加了一点常量,strlen1函数在技术上就可以了。什么是sero-teminated字符串?你认为我怎样才能自己创建strlen函数?@Aviran:我的意思是创建一个基于std::string作为输入的strlen函数可能是我听说过的最愚蠢的事情之一。如果是家庭作业,你应该考虑找一位好老师。”阿尔夫·P·斯坦巴赫:从技术上说,好吧,你说吧,我就在那里。

有很多方法可以做同样的事情,而不用const。但是我同意strlen这样的函数,使参数const看起来合乎逻辑,我不希望strlen被允许破坏原始字符串来计算长度。你确定你必须创建一个strlenb函数,将std::string作为参数,而不是char*?你是对的,我犯了一个错误,需要它作为char*。不幸的是,当我在str和input变量中替换它时,如果说变量“input”未被初始化就被使用,它就不起作用了。我不知道如何使它工作。你确定你必须创建一个strlenb函数,将std::string作为参数,而不是char*?你说得对,我犯了一个错误,需要它作为char*。不幸的是,当我在str和input变量中替换它时,如果说变量“input”未被初始化就被使用,它就不起作用了。我不知道如何让它工作实际上,只要你把字符串设为const,实际上就有一个空终止符。不知道为什么你会说constness在这里很重要。Null不被认为是std::string的终止符。我是这样做的。返回Null是正确的,但当您将其称为终止符时,这里是错误的。@Noah Roberts:const很重要,因为strlen1应该自豪地向世界宣布,它不会为了得到字符串的大小而破坏字符串。。。与尺寸方法一样,原型尺寸\u t尺寸常数@克里斯-当然,但它并不能神奇地使0成为std::string中的终止符。事实上,只要你将字符串设置为常量,实际上就有一个空的终止符。不知道为什么你会说常量在这里很重要。Null不被认为是std::string的终止符。我是这样做的。返回Null是正确的,但当您将其称为终止符时,这里是错误的。@Noah Roberts:const很重要,因为strlen1应该自豪地向世界宣布,它不会为了得到字符串的大小而破坏字符串。。。与尺寸方法一样,原型尺寸\u t尺寸常数@Kris-当然可以,但它并不能神奇地使0成为std::string.const中的终止符,但正如您所说,我认为正确的解决方案是使用参数类型char*而不是string。不幸的是,当我在str和input变量中替换它时,如果说变量“input”未被初始化就被使用,它就不起作用了。我不知道如何使它工作,只需将str变量更改为const char*;将输入保留为字符串。然后像strlen1input.c_str那样称呼它。我从来不知道。显然,在C++0x中,[s.size]将始终返回对NUL字符的引用,您不能修改该值。常量使其工作,但正如您所说,我认为正确的解决方案是使用参数类型char*而不是字符串。不幸的是,当我在str和input变量中替换它时,如果说变量“input”未被初始化就被使用,它就不起作用了。我不知道如何使它工作,只需将str变量更改为const char*;将输入保留为字符串。然后像strlen1input.c_str那样称呼它。我从来不知道。显然,在C++中,0x s[s.size]将始终返回对NUL字符的引用,并且您不能修改该值。