2014-01-11 86 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