2014-02-02 4 views
0

Я создал проект с использованием структуры и указателей для отображения личности. Большинство из них прекрасно работает, но когда дело доходит до цикла, это просто испортит всю программу. Основная идея состояла в том, чтобы работать таким образомC++ для ввода цикла

for (int i = 0; i < 3; i++{ 
    cout << "Whatever" << endl; 
    getline(cin, var_whatever[i]); 
} 

Так было бы запустить цикл 3 раза и попросить пользователя ввести его 3 раза, но при этом работает, он пропускает через первый вход и переходит ко второй , Вот мой код и был бы признателен, если кто-то дает мне решение этой

#include <iostream> 
#include <string> 
#include <Windows.h> 
using namespace std; 

//declare structure to store info about Billy 
struct Son{ 
    string name; 
    int age; 
    string crush; 
    string hobbies[3]; 
}Person; 

int main(){ 
    int i; 
    Son* info = new Son; 
    info = &Person; 
    //user interface 
    //Person's name 
    cout << "Person's name: "; 
    getline(cin, info ->name); //inputs person's name 
    //Person's age 
    cout << "Person's age: "; 
    cin >> info ->age; //inputs person's age 
    //for loop to get hobbies 
    for(i = 0; i <= 3; i++){ //main problem which is giving me headache 
     cout << "Write your hobby[" << i <<"]: "; 
     getline(cin,info ->hobbies[i]); //inputs the person hobby three times 
    } 
    //Person's crush 
    cout << "Write your crush name: "; 
    getline(cin, info ->crush); //inputs the person's crush *opitional* 

    //output statement 
    cout << "Name: " << info ->name << endl; //display name 
    cout << "Age: " << info ->age << endl; //display age 
    for(int j = 0; j < 3; j++){ //display hobbies 
    cout << "Hobbies[" << j << "]: " << info ->hobbies[j] << endl; 
    } 
    cout << "Crush: " << info ->crush << endl; //display crush 
    system("pause"); 
    return 0; 
} 

и выход

Person's name: Billy 
Person's age: 25 
Write your hobby[0]: Write your hobby[1]:soccer 
write your hobby[2]:basketball 
write your hobby[3]:Kungfu 
Write your crush name: Jake 
Name:Billy 
Age:25 
Hobbies[0]: 
Hobbies[1]:soccer 
Hobbies[2]:basketball 
Crush: Jake 

Этот выходной код ад и все равно Спасибо за ваше время

+0

также новичок в C++ так что просто обучение – Jim

+3

Какой драматический титул человек. – Maroun

+0

Треска e extract и основной код не совпадают. – Mat

ответ

2
//for loop to get hobbies 
for(i = 0; i <= 3; i++){ 

должно быть

//for loop to get hobbies 
for(i = 0; i < 3; i++){ 

Вы работаете петлю для i как 0, 1, 2 и 3. Он должен быть 0, 1 и 2.

Кроме того, как правило, будет проще для вас, чтобы обрабатывать ввод последовательно, если вы читаете строки (getline) или читать токены (>>), но не оба.

cout << "Person's age: "; 
string age; 
cin >> age; 
info->age = atoi(age.c_str()); // add #include <cstring> at the top. 
+0

Ну, мне понравилось ваше объяснение @Paul Draper, но не уверен, что вы упомянули о том, что цикл пропускается по первому вводу – Jim

+0

Wait never mind – Jim

0

Проблема здесь:

cin >> info ->age 

Проблема заключается в том, что он читает (предположительно целое число), возраст. Но он не читает маркер конца строки. Таким образом, у вас есть дополнительный EOLM, оставшийся в потоке. Когда вы используете это в сочетании с командой, которая читает строку getline(), она обычно беспорядочна, если вы не принимаете меры предосторожности.

Проблема вызвана смешением operator>> и std::getline(). В этой ситуации вы читаете возраст (но оставляете EOLM в потоке). Первый вызов std::getline() просто будет читать EOLM из потока (и ничего больше).

Лучший способ решить эту проблему - всегда читать интерактивные пользовательский ввод линии в то время. Затем разобрать значение, которое вы хотите от линии.

std::string line; 
std::getline(std::cin, line); 

std::stringstream linestream(line); 
linestream >> info->age; 

Я бы дал этот совет для любого языка, например, в Java java.util.Scanner.next() и java.util.Scanner.nextLine().

+0

Спасибо, это очень помогло и спасибо вам и @ Пол Дрейпер за помощь. – Jim

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