2013-08-05 4 views
0

저는 초보자로서 C++를 배우려고하는 아주 간단한 프로그램을 만들고 있습니다. 짧은 문장에서 모음의 수와 조인자의 수를 단순히 계산하도록 고안되었습니다. 나는 그것을하는 동안 재미있는 작은 딜레마를 보았습니다.콘솔 응용 프로그램 자동 종료 C++

#include <iostream> 
    #include <time.h> 
    #include <string> 


    using namespace std; 



    int main() 
    { int vowells = 0, consenants = 0; 
char sentence[100]; 
char alphabet[] = {'a','e','i','o','u','b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z'}; 
cout << "Please type in a sentence (up to 100 characters max, lower case only): "; 

cin >> sentence; 
cin.ignore(); 

cout << "Your sentence was: " << sentence; 

for (int i=0; i < sizeof(sentence); i++) 
{ 
    if (sentence[i] == alphabet[0]||sentence[i] == alphabet[1]||sentence[i] == alphabet[2]||sentence[i] == alphabet[3]||sentence[i] == alphabet[4]) 
    {vowells++;} 
    else if (sentence[i] == alphabet[5]||sentence[i] == alphabet[6]||sentence[i] == alphabet[7]||sentence[i] == alphabet[8]||sentence[i] == alphabet[9]||sentence[i] == alphabet[10]||sentence[i] == alphabet[11]|| 
     sentence[i] == alphabet[12]||sentence[i] == alphabet[13]||sentence[i] == alphabet[14]||sentence[i] == alphabet[15]||sentence[i] == alphabet[16]||sentence[i] == alphabet[17]||sentence[i] == alphabet[18]|| 
     sentence[19] == alphabet[20]||sentence[i] == alphabet[21]||sentence[i] == alphabet[22]||sentence[23] == alphabet[24]||sentence[i] == alphabet[25]) 
    {consenants++;} 
} 

cout << "\nThe number of vowells is: " << vowells; 
cout << "\nThe number of consenants is: " << consenants; 

cin.get(); 


    } 

죄송합니다 정말 지저분한 외모 : 모두 여기의

우선 코드입니다. 기본적으로 cin >> 문장 뒤에; line 나는 cin.ignore() 함수를 써서 문장을 입력 한 후 엔터 키를 없앱니다. 함수의 끝에서 cin.get()은 단순히 프로그램이 닫히기 전에 다른 입력을 원하기 때문에 중단 점 역할을한다고 가정합니다. 공백없이 1 단어 만 입력하면 프로그램이 실행되고 원하는만큼 끝납니다. 공백이있는 여러 단어를 넣으면 그냥 실행하고 즉시 볼 시간이 없어도 닫힙니다. 나는 이것이 어떤 이유로 공백 때문에 있다고 가정합니다 ... 왜 그들이 이런 방식으로 그것에 영향을 미치는지 확신 할 수 없지만.

기본적으로, 내게 문제가되는 공간입니까? 그렇다면 어떻게 그들을 제거하거나 적어도 프로그램을 무시하게되면 어떻게해야합니까?

감사합니다.

편집 *** 그래서 잠깐 멈추게하려면 Sleep() 명령을 사용할 수 있다고 들었습니다. 이제 문제는 다른 사람이 주석을 달았을 때 cin 함수는 첫 번째 단어 만 허용하고 나머지 문장은 고려하지 않는다는 것입니다. 그래서 나는 공간을 없애거나 어떻게 든 제대로 작동하도록 다른 입력 함수를 사용해야한다고 생각합니다. 이 작업을 수행하는 방법에 대한 제안 사항은 무엇입니까?

+0

디버깅을 했습니까? – icbytes

+1

cin은 공백까지 읽습니다. 그래서 다음 cin은 공백 다음 단어를 읽습니다. –

+0

그래서 getline (cin, sentence)을 사용해야합니다. 그것은 여전히 ​​각 문자가 하나의 공간을 점유하면서 배열에 저장합니까? – Riley

답변

1

내가 아는 바로는 C++의 "잠자기"표준, 크로스 플랫폼 방식이 없습니다. Windows를 실행하는 경우, 다음을 사용할 수 있습니다

#include <windows.h> 
int main(){ 
    //do stuff 
    Sleep(1000); // this will "sleep" for 1s (1000ms) 
} 

Windows를 사용하지 않는 경우, 나는 등뿐만 아니라 거기에 대안이 비슷한 작업을 수행하는/리눅스가 확신합니다. 전에 사용했던 방법을 본 적이 있지만 작동하지 않으면 좋은 대안이 될 것입니다. 예를 들어 threads을 사용할 수 있습니다. 그것은 효과가있을 수 있습니다.

+4

['std :: this_thread :: sleep_for (time_duration);'] (http://en.cppreference.com/w/cpp/thread/sleep_for)가 있습니다. – juanchopanza

+0

@juanchopanza 멋진, 크로스 플랫폼? 아주 멋지다. –

+1

좋아, 리키, 내 프로그램이 실제로 편집 할 때 내 원래 게시물에 추가 할 또 다른 질문을 제기, 그것을 볼 정도로 오래 열려 있어야한다고 말했다. – Riley

1

예, 공백으로 인해 문제가 발생합니다. >> 공백 문자가 발견되면 버퍼로 문자 추출을 중단합니다. 따라서 한 단어 뒤에 한 단어 씩 다른 단어가 오면 첫 번째 단어 만 >>이라는 단일 호출로 버퍼에 저장됩니다. 나중에 cin.get에 전화하면 >> 호출로 모두 가져온 것이 아니므로 스트림에서 읽는 문자가 이미 있습니다.

은 공백뿐만 아니라 다른 문자를 추출 할 수있는 방법을 제공합니다.

//cin >> sentence; 
    //cin.ignore(); 
    cin.getline(sentence, 100) 
+0

우수, 전에 getline()에 대한 구문을 잘못 사용 했었습니다. 위대한 작품에 감사드립니다. – Riley