Строковый индекс вне диапазона. Размер строки неизвестен и циклическая строка до нуля - PullRequest
0 голосов
/ 28 января 2011
#include<iostream>
#include<cmath>
#include<iomanip>
#include<string>

using namespace std;

int main()
{
 string word;
 int j = 0;

 cin >> word;

 while(word[j]){
 cout << "idk";
 j++;
 }
 cout << "nope";



 system("pause");
 return 0;
}

Это всего лишь небольшая пробная программа для проверки этого цикла.Программа, над которой я работаю, состоит из гласных и распечатки гласных из последовательности, определенной пользователем.Строка не определена до тех пор, пока пользователь не наберет. Спасибо за помощь, ребята, заранее.

Ответы [ 2 ]

4 голосов
/ 28 января 2011

Размер std::string равен , а не неизвестен - вы можете получить его, используя функцию-член std::string::size(). Также обратите внимание, что в отличие от C-строк, класс std::string не обязательно должен заканчиваться нулем, поэтому вы не можете полагаться на нулевой символ для завершения цикла.

На самом деле, работать с std::string гораздо приятнее, потому что вы всегда знаете размер. Как и все контейнеры C ++, std::string также поставляется со встроенными итераторами, которые позволяют безопасно проходить по каждому символу в строке. Функция-член std::string::begin() дает вам итератор, указывающий на начало строки, а функция std::string::end() дает вам итератор, указывающий на один после последнего символа.

Я бы рекомендовал освоиться с итераторами C ++. Типичный цикл с использованием итераторов для обработки строки может выглядеть следующим образом:

for (std::string::iterator it = word.begin(); it != word.end(); ++it)
{
   // Do something with the current character by dereferencing the iterator
   // 
   *it = std::toupper(*it); // change each character to uppercase, for example
}
4 голосов
/ 28 января 2011

Попробуйте это для вашей петли:

while(j < word.size()){
  cout << "idk";
  j++;
}
...