2016-01-30 5 views
0

im работает над программой на C++, которая запрашивает имя пользователя и пароль, а затем регистрирует вас на консоли (вроде). После входа в систему он отображает то, что я дважды использовал в своем коде (MYCONSOLE: MYCONSOLE :). Я не очень хорошо объяснял, но, надеюсь, мой код даст вам лучшую идею. Любая идея, что моя ошибка? PS, пожалуйста, не ненавидите меня, если решение прост, им действительно ново для этого langauge. =)Консоль Вывод дублирующего? C++

#include <iostream> 
#include <conio.h> 
#include <string> 
#include <stdio.h> 
#include <windows.h> 

using namespace std; 
int successfullogin(); 
/*USERNAME:ROOT 
    PASSWORD:TOOR*/ 

//Login Screen 
int main() { 
    string username; 
    string password; 
    cout << "Enter UserName: "; 
    cin >> username; 
    cout << endl; 
    if (username == "root") { 
     cout << "Enter PassWord: "; 
     cin >> password; 
     if (password == "toor") { 
      system("cls"); 
      cout << endl << "Login Successful... \n \nPlease wait while console is being initialised..."; 
      Sleep(5000); 
      system("cls"); 
      successfullogin(); 
     } 
     else { 
      cout << endl << "Incorrect Password \a"; 
      system("color 4"); 
      _getch(); 
      system("cls"); 
      system("color f"); 
      main(); 
     } 
    } 
    else { 
     cout << "Incorrect Username \a"; 
     system("color 4"); 
     _getch(); 
     system("cls"); 
     system("color f"); 
     main(); 
    } 
} 


//Console 
int successfullogin() 
{ 
    string input; 
    input.clear(); 
    cout << "MYCONSOLE: "; 
    getline(cin, input); 
    if (input == "shutdown") 
    { 
     return 0; 
    } 
    else 
    { 
     cout << "MYCONSOLE: " << input << endl; 
     _getch(); 
     system("cls"); 
     successfullogin(); 
    } 
    return 0; 
} 
+1

Не называйте 'main' рекурсивно, используйте * петли *. То же самое с функцией «успешного логания», используйте * петли *. –

+1

Возможно, это может быть хорошей идеей показать неправильный вывод как часть вопроса – 4386427

+0

Также избегать вызова 'успешного логарифма' рекурсивно – 4386427

ответ

0

Добавление cin.ignore (INT_MAX, '\ п'); в методе успешногологинга будет выполняться эта работа. Как это:

cin.ignore(INT_MAX, '\n'); 
getline(cin,input); 

По Нотам в Секции Cpp Ссылка:

http://en.cppreference.com/w/cpp/string/basic_string/getline

Вы смешиваете CIN >> стиль с GetLine из КИН. Таким образом, может случиться так, что новая строка char '\ n' не будет заменена потоком cin и немедленно вернется вызовом getline.

хороший способ для экрана прозрачного раствора:

void clear(){ 
    CONSOLE_SCREEN_BUFFER_INFO Info; 
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Info); 
    SHORT Width = Info.srWindow.Right - Info.srWindow.Left + 1; 
    for (SHORT N = Info.srWindow.Top; N <= Info.srWindow.Bottom; ++N) { 
     DWORD Chars; 
     COORD Pos = { Info.srWindow.Left, N }; 
     FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ' ', Width, Pos, &Chars); 
     FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0, Width, Pos, &Chars); 
    } 
    COORD TopLeft = { Info.srWindow.Left, Info.srWindow.Top }; 
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), TopLeft); 
} 
+0

Спасибо за это =) – billy606

+0

Чтобы избавиться от рекурсий, это хороший совет, и то, что они не упомянули, - это решение системы («cls»). Это простой способ очистки экрана, но не очень умный. Дополнительная информация здесь: http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/clearing-the-tui-screen.html – zinnjonas

+0

С несколькими изменениями на примере заполнения окна вы получите отличную четкую функцию. sry должен продлиться один комментарий – zinnjonas

0

Попробуйте добавить эти строки

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

к началу successfullogin

Проблема, кажется, что есть еще что-то готовое для вас в cin так getline Виль немедленно вернуться.

Как упоминалось в комментариях Йоахима Пилеборга и меня, вы не должны делать рекурсивные звонки. Ваш main может быть вместо этого, как:

int main() { 
    while(1) // Use an "endless" loop 
    { 
    string username; 
    string password; 
    cout << "Enter UserName: "; 
    cin >> username; 
    cout << endl; 
    if (username == "root") { 
     cout << "Enter PassWord: "; 
     cin >> password; 
     if (password == "toor") { 
      system("cls"); 
      cout << endl << "Login Successful... \n \nPlease wait while console is being initialised..."; 
      Sleep(5000); 
      system("cls"); 
      successfullogin(); 

      break; // To end the while(1) loop 
     } 
     else { 
      cout << endl << "Incorrect Password \a"; 
      system("color 4"); 
      _getch(); 
      system("cls"); 
      system("color f"); 
      // main(); remove line 
     } 
    } 
    else { 
     cout << "Incorrect Username \a"; 
     system("color 4"); 
     _getch(); 
     system("cls"); 
     system("color f"); 
     // main(); remove line 
    } 
    } 
} 

То же самое относится и здесь

int successfullogin() 
{ 
    cin.clear(); 
    cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); 
    while(1) 
    { 
    string input; 
    input.clear(); 
    cout << "MYCONSOLE: "; 
    getline(cin, input); 
    if (input == "shutdown") 
    { 
     return 0; 
    } 
    else 
    { 
     cout << "MYCONSOLE: " << input << endl; 
     _getch(); 
     system("cls"); 
     // successfullogin(); remove line 
    } 
    } 

    return 0; 
} 
+0

Получил это, хотя использование циклов делает разницу в выходе или оно то же самое. – billy606

+0

Попробуйте ........ :-) – 4386427

+0

Это сработало? Он должен дать то же самое и решить важную проблему, т. Е. Ваш исходный код продолжал добавлять в стек, что приводило бы к переполнению стака. – 4386427

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