C++ cin一直在跳

标签 c++ readline cin input-buffer

我的程序有问题。当我运行它时,它会向用户询问专辑、标题,但随后它就退出了循环,而没有询问价格和销售税。知道发生了什么事吗?

这是一个示例运行

Discounts effective for September 15, 2010
Classical   8%
Country 4%
International   17%
Jazz    0%
Rock    16%
Show    12%
Are there more transactions? Y/N
y
Enter Artist of CD: 
Sevendust
Enter Title of CD: 
Self titled
Enter Genre of CD: 
Rock
enter price
Are there more transactions? Y/N
Thank you for shopping with us!

Program code:

#include <iostream>

#include <string>



using namespace std;



int counter = 0;

string discount_tiles[] = {"Classical", "Country", "International", "Jazz", "Rock", "Show"};

int discount_amounts[] = {8, 4, 17, 0, 16, 12, 14};

string date = "September 15, 2010";



// Array Declerations

    //Artist array

    char** artist = new char *[100];        

    //Title array

    char** title = new char *[100]; 

    //Genres array

    char** genres = new char *[100];

    //Price array

    double* price[100]; 

    //Discount array

    double* tax[100];

    // sale price array

    double* sale_price[100];    

    //sale tax array

    double* sale_tax[100];  

    //cash price array

    double* cash_price[100];    



//Begin Prototypes

char* getArtist();

char* getTitle();

char* getGenre();

double* getPrice();

double* getTax();

unsigned int* AssignDiscounts();

void ReadTransaction (char ** artist, char ** title, char ** genre, float ** cash, float & taxrate, int albumcount);

void computesaleprice();





bool AreThereMore ();



//End Prototypes



bool areThereMore ()

{   

    char answer;

    cout << "Are there more transactions? Y/N" << endl;

    cin >> answer;

    if (answer =='y' || answer =='Y')

        return true;

    else 

        return false;

}



char* getArtist()

{

    char * artist= new char [100];

    cout << "Enter Artist of CD: " << endl;

    cin.getline(artist,100);

    cin.ignore();

    return artist;

}



char* getTitle()

{

    char * title= new char [100];

    cout << "Enter Title of CD: " << endl;

    cin.getline(title,100);

    cin.ignore();

    return title;

}



char* getGenre()

{

    char * genre= new char [100];

    cout << "Enter Genre of CD: " << endl;

    cin.getline(genre,100);

    cin.ignore();

    return genre;

}



double* getPrice()

{   

    //double* price = new double();

    //cout << "Enter Price of CD: " << endl;

    //cin >> *price;



    //return price;



    double p = 0.0;

    cout<< "enter price" << endl;

    cin >> p;

    cin.ignore();

    double* pp = &p;

    return pp;

}



double* getTax()

{

    double* tax= new double();

    cout << "Enter local sales tax: " << endl;

    cin >> *tax;



    return tax;

}



int findDiscount(string str){



    if(str.compare(discount_tiles[0]) == 0)

        return discount_amounts[0];

    else if(str.compare(discount_tiles[0]) == 0)

        return discount_amounts[1];

    else if(str.compare(discount_tiles[0]) == 0)

        return discount_amounts[2];

    else if(str.compare(discount_tiles[0]) == 0)

        return discount_amounts[3];

    else if(str.compare(discount_tiles[0]) == 0)

        return discount_amounts[4];

    else if(str.compare(discount_tiles[0]) == 0)

        return discount_amounts[5];

    else{

        cout << "Error in findDiscount function" << endl;

        return 0;

    }

}



void computesaleprice()

{

    /** fill in array for all purchases **/

    for( int i=0; i<=counter; i++){

        double temp = *price[i];

        temp -= findDiscount(genres[i]);

        double* tmpPntr = new double();

        tmpPntr = &temp;

        sale_price[i] = tmpPntr;

        delete(&temp);

        delete(tmpPntr);

    }

}











void printDailyDiscounts(){

    cout << "Discounts effective for " << date << endl;

    for(int i=0; i < 6; i++){

        cout << discount_tiles[i] << "\t" << discount_amounts[i] << "%" << endl;

    }

}



//Begin Main

int main ()

{







    for( int i=0; i<100; i++){

        artist[i]=new char [100];

        title[i]=new char [100];

        genres[i]=new char [100];       

        price[i] = new double(0.0);

        tax[i] = new double(0.0);

    }



    // End Array Decleration



    printDailyDiscounts();



    bool flag = true;   

    while(flag == true){

        if(areThereMore() == true){

            artist[counter] = getArtist();

            title[counter] = getTitle();

            genres[counter] = getGenre();

            price[counter] = getPrice();

            //tax[counter] = getTax();          

            //counter++;

            flag = true;

        }

        else {

            flag = false;

        }

    }





    //compute sale prices

    //computesaleprice();













    cout << "Thank you for shopping with us!" << endl;



    return 0;

}

//End Main













/**

void ReadTransaction (char ** artist, char ** title, char ** genre, float ** cash, float & taxrate, int albumcount)

{

    strcpy(artist[albumcount],getArtist());

    strcpy(title[albumcount],getTitle());

    strcpy(genre[albumcount],getGenre());

    //cash[albumcount][0]=computesaleprice();???????

    //taxrate=getTax;??????????????





}

* 

* */







unsigned int * AssignDiscounts()

{

    unsigned int * discount = new unsigned int [7];

    cout << "Enter Classical Discount: " << endl;

    cin >> discount[0];

    cout << "Enter Country Discount: " << endl;

    cin >> discount[1];

    cout << "Enter International Discount: " << endl;

    cin >> discount[2];

    cout << "Enter Jazz Discount: " << endl;

    cin >> discount[3];

    cout << "Enter Pop Discount: " << endl;

    cin >> discount[4];

    cout << "Enter Rock Discount: " << endl;

    cin >> discount[5];

    cout << "Enter Show Discount: " << endl;

    cin >> discount[6];

    return discount;

}



/**

char ** AssignGenres ()

{

    char ** genres = new char * [7];

    for (int x=0;x<7;x++)

        genres[x] = new char [20];

    strcpy(genres [0], "Classical");

    strcpy(genres [1], "Country");

    strcpy(genres [2], "International");

    strcpy(genres [3], "Jazz");

    strcpy(genres [4], "Pop");

    strcpy(genres [5], "Rock");

    strcpy(genres [6], "Show");

    return genres;

}

**/







float getTax(float taxrate)

{

    cout << "Please enter store tax rate: " << endl;

    cin >> taxrate;

    return taxrate;

}

最佳答案

您正在从 getPrice 返回一个指向局部变量的指针:

double* getPrice()
{   
    double p = 0.0;
    cout<< "enter price" << endl;
    cin >> p;
    cin.ignore();
    double* pp = &p;
    return pp;
}

由于当您从函数返回时 p 超出范围(即被销毁),您会得到一个悬空指针,这会导致未定义的行为。

因为对 getTax() 的调用被注释掉了,所以不要求缴纳销售税。

关于C++ cin一直在跳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2484913/

相关文章:

c++ - 如何在两个不同大小的 vector 中找到公共(public)数字

node.js - readline 在 nodejs 发出 rl.close() 后不会停止行读取

c++ - cin.getline() 奇怪的行为

c++ - 不会让我在 IF 语句后读取用户输入(作业)

c++ - 点云库在VS 2019中不起作用,但在VS 2017中可以工作

c++ - 如何为不同的分支使用不同的 Xcode 版本(或具有不同 Clang 版本的最新 Xcode)?

c++ - 循环依赖问题

c - 使用指针传递结构时未声明的标识符

java - 我应该如何从缓冲阅读器中读取内容?

c++ - 在 C++ 中使用两个 getline(cin,s)