Функция, которая будет действовать как Strlen C ++ - PullRequest
1 голос
/ 03 февраля 2011

Я хочу сделать функцию, которая будет делать то же самое, что и Стрлен, и я получаю сообщение об ошибке: «строковый индекс вне диапазона».Я пытался исправить это, но понятия не имею.

вот код:

#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;
}

спасибо!

Ответы [ 4 ]

4 голосов
/ 03 февраля 2011

Короче говоря, для не-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*.

Это имело бы больше смысла, и тогда также работала бы функция.

Приветствия & hth.,

3 голосов
/ 03 февраля 2011

Похоже, вы ошибочно полагаете, что std :: string совпадает со строкой в ​​стиле C (char const *).Это просто неправда.Терминатор NULL отсутствует.

Вот ваша функция strlen, только так она будет работать:

int strlen1(string str) { return static_cast<int>(str.size()); }
1 голос
/ 03 февраля 2011

std::string имеет хороший метод size() для этого.

0 голосов
/ 03 февраля 2011

strlen основано на строках с нулем в конце (char * или символьные массивы), C ++ string основано на длине + данных, вы не можете получить доступ к данным после конца строки (где терминал ноль будет). Кроме того, получение длины является стандартным свойством строк C ++ (size ()), поэтому стандартный способ написания strlen - это просто вызов size.

...