если заявление & amp; звездочка взломала мою программу

Целью следующего кода является создание базы данных псевдо-фильмов и возможность поиска по ней с помощью двух запросов. Сама программа работала до тех пор, пока я тоже не попытался поставить имя пользователя и пароль на место (пароль отображается на экране со звездочками). Чтобы использовать имя пользователя и пароль, я настроил оператор if так, что if (username == «user» && пароль == «слово») будет отображаться «Привет, пользователь». Вместо ожидаемого результата меня встретили

Unhandled exception at 0x00cf3e36 in Movies.exe: 0xC0000005: Access violation writing location 0xcccccccc.

Код выглядит следующим образом

//global variables
char title [20], y, n;
int year;
string search;
//function 1
void sort_on_title(movies_iit films[], int n)
{
//Local struct variable used to swap records
movies_iit temp;

for(int i=0; i<n-1; i++)
{
for(int i=0; i<n-1; i++)
{
/*If s[i].title is later in alphabet than
s[i+1].title, swap the two records*/
if(films[i].title>films[i+1].title)
{
temp = films[i];
films[i] = films[i+1];
films[i+1] = temp;
}
}
}
}
//end function 1
//function query1 prototype
void query1 (movies_iit movie);
//function query2 prototype
void query2 (movies_iit movie);
//function 2 prototype
void printmovie (movies_iit movie);
//beginning of main
int main ()
{
//login
//username: username
//password: password
string mystr;
int n;
char response;
string c[9];
string name;
cout << "enter your username "<<endl;
cin >> name;
cout << "enter your password "<<endl;
for (int i=0;i<9;i++)
{
c[i] = getch();
printf ("*");
}

cout << "\n" << endl;

if (name == "username" && c[9] == "password")
cout << "Welcome, user." << endl;
else
{cout << "###" <<  "unrecognized username/password combination" << "\t" << "please try again"     << "###" << endl;
system("PAUSE");
return 0;
}
for (n=0; n<NUM_MOVIES; n++)
{
cout << "Enter title: ";
getline (cin,films[n].title);
cout << "Enter year: ";
getline (cin,mystr);
stringstream(mystr) >> films[n].year;
}
//sort records, function 1 call
sort_on_title(films, NUM_MOVIES);
cout << "\nYou have entered these movies:\n";
for (n=0; n<NUM_MOVIES; n++)
printmovie (films[n]);  //function 2 call
//Query 1
cout << "Perform an alphabetical search? (y/n)" << endl;
cin >> response;

if (response == 'y')
{cout << "Please enter title" << endl;
cin >> title;
for (n=0; n<NUM_MOVIES; n++)
{query1 (films[n]);
response == n;
}
}
else if (response == 'n')
cout << "\n" << endl;
else
cout << "invalid entry" << endl;
//Query 2
cout << "Perform a chronological search? (y/n)" << endl;
cin >> response;
//greater than
if (response == 'y')
{   cout << "greater than what year?" << endl;
cin >> year;
for (n=0; n<NUM_MOVIES; n++)
{   query2 (films[n]);
}
}
else if (response == 'n')
cout << "Thank you, goodbye." << endl;
else
cout << "invalid entry" << endl;
system("pause");
return 0;
}
//end of  main
//function 2 definition
void printmovie (movies_iit movie)
{
cout << movie.title;
cout << " (" << movie.year << ")\n";
}
//function query1 defintion
void query1 (movies_iit movie)
{
if (movie.title == title)
{cout << " >> " << movie.title;
cout << " (" << movie.year << ")\n";}
else
{cout << movie.title;
cout << " (" << movie.year << ")\n";}
}
//function query2 definition
void query2 (movies_iit movie)
{
if (movie.year >= year)
{cout << movie.title;
cout << " (" << movie.year << ")\n";
}
}

Как я могу заставить мою программу работать должным образом?
* если это имеет значение, программа работала правильно, прежде чем я добавил код для имени пользователя & пароль и оператор if

ниже размещена оригинальная версия (которая работает)

// array of structures
#include <iostream>
#include <string>
#include <sstream>
#include <conio.h>
#include <stdio.h>
#include <cctype>
using namespace std;

#define NUM_MOVIES 6
//structure
struct movies_iit{
string title;
int year;
} films [NUM_MOVIES];
//global variables
char title [20], y, n;
int year;
string search;
//function 1
void sort_on_title(movies_iit films[], int n)
{
//Local struct variable used to swap records
movies_iit temp;

for(int i=0; i<n-1; i++)
{
for(int i=0; i<n-1; i++)
{
/*If s[i].title is later in alphabet than
s[i+1].title, swap the two records*/
if(films[i].title>films[i+1].title)
{
temp = films[i];
films[i] = films[i+1];
films[i+1] = temp;
}
}
}
}
//end function 1
//function query1 prototype
void query1 (movies_iit movie);
//function query2 prototype
void query2 (movies_iit movie);
//function 2 prototype
void printmovie (movies_iit movie);
//beginning of main
int main ()
{
//login
//username: user
//password: word
string mystr;
int n;
char response;
string c[4];
string name;
for (n=0; n<NUM_MOVIES; n++)
{
cout << "Enter title: ";
getline (cin,films[n].title);
cout << "Enter year: ";
getline (cin,mystr);
stringstream(mystr) >> films[n].year;
}
//sort records, function 1 call
sort_on_title(films, NUM_MOVIES);
cout << "\nYou have entered these movies:\n";
for (n=0; n<NUM_MOVIES; n++)
printmovie (films[n]);  //function 2 call
//Query 1
cout << "Perform an alphabetical search? (y/n)" << endl;
cin >> response;

if (response == 'y')
{cout << "Please enter title" << endl;
cin >> title;
for (n=0; n<NUM_MOVIES; n++)
{query1 (films[n]);
response == n;
}
}
else if (response == 'n')
cout << "\n" << endl;
else
cout << "invalid entry" << endl;
//Query 2
cout << "Perform a chronological search? (y/n)" << endl;
cin >> response;
//greater than
if (response == 'y')
{   cout << "greater than what year?" << endl;
cin >> year;
for (n=0; n<NUM_MOVIES; n++)
{   query2 (films[n]);
}
}
else if (response == 'n')
cout << "Thank you, goodbye." << endl;
else
cout << "invalid entry" << endl;
system("pause");
return 0;
}
//end of  main
//function 2 definition
void printmovie (movies_iit movie)
{
cout << movie.title;
cout << " (" << movie.year << ")\n";
}
//function query1 defintion
void query1 (movies_iit movie)
{
if (movie.title == title)
{cout << " >> " << movie.title;
cout << " (" << movie.year << ")\n";}
else
{cout << movie.title;
cout << " (" << movie.year << ")\n";}
}
//function query2 definition
vvoid query2 (movies_iit movie)
{
if (movie.year >= year)
{cout << movie.title;
cout << " (" << movie.year << ")\n";
}
}

0

Решение

Вы смешиваете string с операциями для char *, Вам не нужен массив string просто чтобы сохранить пароль, просто прочитайте его, как вы делаете с именем. Если вы хотите прочитать пароль с помощью getch для * вещь, прочитайте в char[9] а затем преобразовать в string (только 1 строка).

И кстати, c[9] не существует, что вы пытаетесь с этим делать?

Кстати 2: если вы читаете 9 символов в char[9] и вы не установите последнюю позицию в 0, когда вы попытаетесь использовать любую функцию, связанную со строками, произойдет что-то плохое (не говоря уже о "password" имеет длину 8, поэтому он не может соответствовать).

2

Другие решения

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

string c[9];

Выше не означает «строка с максимум 9 символами», это означает «массив из 9 строк с таким количеством символов, которое вы вводите». В петле:

for (int i=0;i<9;i++){
c[i] = getch();
}

Вы вводите 1 символ в КАЖДУЮ строку (не 9 символов в одной строке). Затем, когда вы пытаетесь сравнить c[9] с помощью «пароля» программа пытается получить доступ к элементам c[9] которые не существуют.

0