2013-07-21 3 views
1

В последнее время я работаю над назначением корзины покупок и не понимаю, почему этот код ниже не работает.Назначение корзины, концепции на getline()

Мне нужно написать код, который будет выводить имя, стоимость и количество элементов для трех элементов без использования массивов.

В конце максимум трех элементов я должен отобразить общую стоимость предметов. В настоящее время я застреваю, потому что после того, как я добавлю второй элемент, кажется, что программа не запрашивает первый вход (имя элемента). Вот код:

#include <iostream> 

int main() { 
    int total; 

    std::cout << "Item name:"; 
    std::string itemName; 
    std::getline(std::cin,itemName); 

    std::cout << "Cost(in cents):"; 
    int cost; 
    std::cin >> cost; 

    std::cout << "Quantity:"; 
    int quantity; 
    std::cin >> quantity; 

    std::cout << "Do you want to add more items? (Y/N)"; 
    char option; 
    std::cin >> option; 

    if (option == 'y') { 
    std::cout << "Item name:"; 
    std::string itemName2; 
    std::getline(std::cin,itemName2); 

    std::cout << "Cost(in cents):"; 
    int cost2; 
    std::cin >> cost2; 

    std::cout << "Quantity:"; 
    int quantity2; 
    std::cin >> quantity2; 

    std::cout << "Do you want to add more items? (Y/N)"; 
    char option2; 
    std::cin >> option2; 

    if (option2 == 'y') { 
     std::cout << "Item name:"; 
     std::string itemName3; 
     std::getline(std::cin,itemName3); 

     std::cout << "Cost(in cents):"; 
     int cost3; 
     std::cin >> cost3; 

     std::cout << "Quantity:"; 
     int quantity3; 
     std::cin >> quantity3; 

     total = cost*quantity + cost2*quantity2 + cost3*quantity3; 
     std::cout << "Total value:" << total; 
    } 
    else { 
     total = cost*quantity + cost2*quantity2; 
     std::cout << "Total value:" << total; 
    } 
    } 
    else { 
    total = cost*quantity; 
    std::cout << "Total value:" << total; 
    } 

    return 0; 
} 

После ввода ввода «у» после каждого входа элемента, код будет каким-то образом пропустить мой вход для ITEMNAME и вывода «Стоимость (в центах):» вместе с «Имя элемента:» в той же линии.

Я действительно думаю, что это как-то связано с функцией getline(), но я точно не знаю. Любая помощь приветствуется.

+0

возможно дубликат [GetLine не задаёте?] (Http://stackoverflow.com/questions/6642865/getline-not-asking- для ввода) – interjay

ответ

1

К сожалению, вы используете getline и не включили <string> файл заголовка.

Во-вторых, вы можете столкнуться с проблемой из-за cin буфера. вы должны использовать cin.ignore() после ввода ввода для option для извлечения символов и отбрасывания или другой опции может быть очистка cin буфер.

cin.ignore() будет работать для игнорирования 1 символа в потоке.
вы можете попробовать std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); Это извлечет столько символов до `` \ п «»


Я попытался следующий код на VS2012, и она работала должным образом.

#include <iostream> 
#include <string> 


int main() { 
int total; 

std::cout << "Item name:"; 
std::string itemName; 
std::getline(std::cin,itemName); 

std::cout << "Cost(in cents):"; 
int cost; 
std::cin >> cost; 

std::cout << "Quantity:"; 
int quantity; 
std::cin >> quantity; 

std::cout << "Do you want to add more items? (Y/N)"; 
char option; 
std::cin >> option; 
std::cin.ignore(); 

if (option == 'y') { 
std::cout << "Item name:"; 
std::string itemName2; 
std::getline(std::cin,itemName2); 

std::cout << "Cost(in cents):"; 
int cost2; 
std::cin >> cost2; 

std::cout << "Quantity:"; 
int quantity2; 
std::cin >> quantity2; 

std::cout << "Do you want to add more items? (Y/N)"; 
char option2; 
std::cin >> option2; 
    std::cin.ignore(); 

if (option2 == 'y') { 
    std::cout << "Item name:"; 
    std::string itemName3; 
    std::getline(std::cin,itemName3); 

    std::cout << "Cost(in cents):"; 
    int cost3; 
    std::cin >> cost3; 
    std::cout << "Quantity:"; 
    int quantity3; 
    std::cin >> quantity3; 

    total = cost*quantity + cost2*quantity2 + cost3*quantity3; 

    std::cout << "Total value:" << total; 
} 
    else { 
    total = cost*quantity + cost2*quantity2; 
    std::cout << "Total value:" << total; 
} 
} 
else { 
total = cost*quantity; 
std::cout << "Total value:" << total; 
} 

system("pause"); 
return 0; 
} 

Для получения дополнительной информации о cin.ignore()see this link.

0

Вы должны использовать

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

Для Вытащите \n, оставшиеся после ввода option.

+0

Извините, но что это точно делает? Извините, я до сих пор совершенно не знаком с C++. – xbili

+0

@xbili, вы могли бы узнать больше об этом [здесь] (http://en.cppreference.com/w/cpp/io/basic_istream/ignore). – soon

-1

вы можете сделать: зЬй: CIN >> ITEMNAME

вместо делать: зЬй :: GetLine (станд :: CIN, ITEMNAME)

Это было бы самым простым подход для строк без пробелов!

+0

Это нехороший подход для ввода строк, так как он не будет работать должным образом, если в строку входит пробел. –

Смежные вопросы