-3

У меня есть программа, только вот она почему-то не работает. Вот главная функция из нее. Что не так?

void readfile()
{
    ifstream f("text.txt", ios_base::in);
    string s;
    int i = 0;
    char c;
    cout << "Какой символ?";
    cin >> c;
    while (f){
        f >> s;
        i += (s[s.length()] == c) ? 1 : 0;
    }
    cout << "Таких строк: " << i;
    system("pause");
}

Она должна считать количество строк оканчивающихся на заданный символ. Она работает но не правильно. Все время пишет что 0.

Kyubey
  • 32,103

1 Answers1

1

Индексация в C++ производится от нуля, то есть индексы находятся в диапазоне от 0 до (N-1).

В вашем случае последний символ строки можно получить так:

s[s.length() - 1]

или просто (если компилятор новый):

s.back()

или для верности (чтобы проверялась доступность индекса):

s.at(s.size() - 1)
Kyubey
  • 32,103
  • @Abyx Да, и это тоже. Кстати, индекс проверяется библиотекой? Исключение будет? – Kyubey May 06 '15 at 11:27
  • О_о, подсчитало, только вот что. Строка у меня всего 1, и заканчивается на "F", я ввожу этот символ и она выдает теперь не 0, а 2 строки. @Athari – papalimer May 06 '15 at 11:31
  • @papalimer Вы исправили код в соответствии с рекомендацией от Abyx в комментарии под вашим вопросом? – Kyubey May 06 '15 at 11:34
  • @Athari еще нет, понял. – papalimer May 06 '15 at 11:35
  • 1
    Кстати, при самом простом цикле чтения по словам (ТС, конечно хочет одно, но пишет-то другое) проверять, что s не пустое не нужно (оно просто не может быть пустым) / А почти весь код (теперь, думаю, уже можно) получается вообще однострочником: while (f >> s) i += s[s.size() - 1] == c; – avp May 06 '15 at 14:20
  • @avp Неявно складывать bool и int — это всё-таки дурной тон, и новичков такому учить не надо. :) – Kyubey May 06 '15 at 15:00
  • @Athari, ну, когда-то же они про это (естественно, приведение типов в языке Си) все равно узнают (если свяжут свою жизнь с программированием). – avp May 06 '15 at 16:47