2011-01-28 5 views
0
#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; 
} 

이것은이 루프를 테스트하기위한 간단한 시험 프로그램입니다. 내가 작업하고있는 프로그램은 모음과 사용자가 결정한 순서대로 모음을 출력하는 것입니다. 문자열은 사용자가 입력 할 때까지 정의되지 않습니다. 사전에 도움을 주셔서 감사합니다.문자열 첨자가 범위를 벗어납니다. 문자열 크기는 알 수 없으며 null까지 루프 문자열입니다.

답변

4

루프이 시도 :

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

문자열의 길이는 C 문자열과 같이 null로 끝나는 문자 배열이 아닙니다. 문자열 길이를 초과하여 [] 연산자를 호출하면보고 된 오류가 발생합니다. null로 끝나는 문자 배열의 경우 : string :: c_str() 메서드를 사용하십시오. – Keith

+0

+1 word.length()가 작동하고, 개인적으로이 상황과 같은 상황에서 루프를 선호합니다. – nybbler

4

std::string의 크기는 하지 알 수없는 - 당신은이 std::string::size() 멤버 함수를 사용하여 얻을 수 있습니다. 또한 C 문자열과 달리 std::string 클래스는 null로 종료 될 필요가 없으므로 null 문자를 사용하여 루프를 종료 할 수 없습니다.

실제로 크기를 알고 있기 때문에 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 
}