【问题标题】:C++ cin keeps skippingC++ cin 一直跳
【发布时间】:2010-03-20 21:48:33
【问题描述】:

我的程序有问题。当我运行它时,它会询问用户专辑、标题,但随后它只是退出循环而不询问价格和销售税。有什么想法吗?

这是一个示例运行

折扣于 2010 年 9 月 15 日生效 古典 8% 国家 4% 国际 17% 爵士乐 0% 摇滚 16% 显示 12% 有没有更多的交易?是/否 是的 输入 CD 艺术家: 七尘 输入 CD 标题: 自称 输入 CD 类型: 岩石 输入价格 有没有更多的交易?是/否 感谢您与我们购物!

程序代码:

#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;

}

【问题讨论】:

  • 你试过什么调试?例如程序每个阶段所有变量的值是多少?
  • 请重新格式化您的代码以删除过多的垂直空格。
  • 拥有if(str.compare(discount_tiles[0]) == 0) ... else if(str.compare(discount_tiles[0]) == 0) ... else if(str.compare(discount_tiles[0]) == 0) 有什么意义?第一个之后的永远不会匹配

标签: c++ readline cin input-buffer


【解决方案1】:

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

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

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

由于对getTax() 的调用已被注释掉,因此未要求征税。

【讨论】:

    猜你喜欢
    • 2011-02-04
    • 2014-04-01
    • 2019-05-14
    • 2015-01-28
    • 2018-09-18
    • 1970-01-01
    • 2023-03-15
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多