2014-01-11 87 views
1

我有一個奇怪的問題。即時通訊使用Visual Studio 2012,多數民衆贊成我的代碼:(東西是波蘭人,但我希望你會明白它是如何工作的)。(C++)不會在std :: cin中停止並進入無限循環?

#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <queue> 

using namespace std; 

#pragma warning (disable: 4996); 

struct strona 
{ 
    int zawartosc; 
    int gdzie; 

}; 

void Wyswietl(int tab[], int dlugosc) 
{ 
    cout<<"Tablica wyglada tak"<<endl; 
    for(int i=0;i<dlugosc;i++) 
    { 
     cout<<tab[i]<<"\t"; 
    } 
    cout<<endl; 
} 


int main() 
{ 
    int ileStron=3; 


    int *tablicaStron, *tablicaBitowOdniesienia; 
    tablicaStron=new int[ileStron]; 
    tablicaBitowOdniesienia=new int[ileStron]; 


    queue <strona> kolejka; 


    char opcja='a'; 
    while(opcja!='k') 
    { 
     cout<<"(D)odawac (K)oniec (W)yswietl"; 
     cin>>opcja;//DONT STOP THE PROGRAM! 
     if(opcja=='D'|opcja=='d') 
     { 
      strona tymczas; 
      cout<<"Podaj co dodać do kolejki"; 
      cin>>tymczas.zawartosc; 
      int licznik=0; 
      if(kolejka.size()<ileStron) 
      { 
       tymczas.gdzie=kolejka.size(); 

       kolejka.push(tymczas); 
       tablicaStron[tymczas.gdzie]=tymczas.zawartosc; 
      } 
      else if(kolejka.size()==ileStron) 
      { 
       cout<<"bang bang"; 
       int czyJest=0; 
       int licznikfora=0; 
       for(int i=0;i<ileStron;i++)//sprawdza czy wpisywana strona nie istnieje przypadkiem w tablicy stron 
       { 
        if(tablicaStron[i]==tymczas.zawartosc) 
        { 
         czyJest=1; 

        } 

        licznikfora++; 
       } 
       cout<<"czyJest ma wartosc "<<czyJest<<" a licznik fora "<<licznikfora<<endl; 
       if(czyJest==0) 
       { 
        tymczas.gdzie=kolejka.front().gdzie; 
        kolejka.pop();//TUTAJ SIE BEDZIE ZAPISYWAC DO PAMIECI WIRTUALNEJ 
        kolejka.push(tymczas); 
        tablicaStron[tymczas.gdzie]=tymczas.zawartosc; 
       } 
       else if(czyJest==1) 
       { 
        cout<<"to co chcesz dodac juz jest w pamieci"; 
       } 
      } 
      else 
      { 
       cout<<"rozmiar kolejki sie nie zgadza"; 
      } 

     } 
     else if(opcja=='W'|opcja=='w') 
     { 
      Wyswietl(tablicaStron,ileStron); 
      cout<<endl; 
      cout<<"pierwszy element w kol: "<<kolejka.front().zawartosc<<"|"<<kolejka.front().gdzie<<" " 
       <<"ostatni element w kol: "<<kolejka.back().zawartosc<<"|"<<kolejka.back().gdzie<<endl; 
     } 
    } 






    system("pause"); 
    return 0; 

} 

的問題是,選擇選項(d)之後 - 只需鍵入d,然後按回車,然後輸入任意幾個字母,程序應該表現出你

(D)odawac (K)oniec (W)yswietl 

,但它已經開始循環,無限遠...

問題是什麼?

+0

你試過scanf嗎? 當你說無限循環,是否打印「(D)odawac(K)oniec(W)yswietl」無限? – rplusg

+0

它顯示 (d)odawac(K)oniec(W)yswietl:d Podaj共dodaŠ做kolejki:● 這inifinitely: (d)odawac(K)oniec(W)yswietl:Podaj共同dodaŠ (D)odawac(K)oniec(W yswietl:Podaj cododaŠdo kolejki:(D)odawac(K)oniec(W)yswietl:Podaj co dod Šdo kolejki:bang bangczyJest ma wartosc 1 a licznik (D)odawac(K)oniec(W)yswietl: – wiwo

+0

和我試過scanf - 同樣! – wiwo

回答

0

我覺得問題是這樣的陳述: cin >> tymczas.zawartosc;

在這一點上,如果你給一個字符或字符串輸入,程序爆炸。

使您的程序正常工作: 啓動程序並只給出一個輸入d,讓控件碰到這一點:cin >> tymczas.zawartosc; 現在在這裏輸入一個數字,因爲它是int類型。現在控制命中第一個cin。

問題是使用cin讀取int但用戶輸入字符或字符串。行爲在這種情況下是不確定的。 此鏈接應解決混淆:C++ character to int

+0

我是一個白癡...... 非常感謝幫助! 它的一個上午8點(上午6點41分,我沒有睡覺)的一個相當大的項目的一小部分! – wiwo

+0

對不起,我剛醒來,讓我知道你是否想要更多的細節。樂意幫助:) – rplusg

+0

@ user3184237您是否可以通過點擊勾號接受該答案?它有很多幫助。 – 0x499602D2