C de la getline ou cin ne pas accepter une chaîne avec des espaces, je l'ai cherché Google et je suis toujours perplexe!
Question
Tout d'abord, merci à tous ceux qui me aide, il est très apprécié!
Je suis en train de stocker une chaîne avec des espaces et des caractères spéciaux intacts dans MessageToAdd
.
J'utilise getline (cin,MessageToAdd);
et j'ai aussi essayé cin >> MessageToAdd;
.
Je suis tellement déconcerté! Quand j'entre l'entrée de l'échantillon
test
Tout fonctionne comme prévu. Cependant, si je devais utiliser
Test Test Test
La console entière serait juste clignote rapidement jusqu'à ce que je pressais Ctrl C .
Mon style de mettre les variables en haut on m'a dit est obsolète. S'il vous plaît pardonnez-moi comme je suis toujours moi-même l'enseignement et il est tout simplement la force de l'habitude. Je vais changer mon style peu après que je reçois cette résolu:)
void AddMessage() {
ifstream myReadFile;
string str;
string MessageToAdd;
string myMessages[10];
int i; // of course my famous i
static string rowHtmlCloseTags;
static string rowHtmlOpenTags;
string replacement;
myReadFile.open("C:\\Users\\Andrews\\Documents\\Visual Studio 2010\\Projects\\computerclass\\Debug\\outages.htm",ios::in);
i = 0; //the start of my array
rowHtmlCloseTags = "</b></td>"; // value that I want to replace with nothing
rowHtmlOpenTags = "<td><b>";
if(!myReadFile) // is there any error?
{
cout << "Error opening the file! Aborting…\n";
exit(1);
}
if (myReadFile.is_open())
{
cout << endl;
while (!myReadFile.eof())
{
getline(myReadFile, str);
if (str == "<tr>")
{
getline(myReadFile, str); //get the next line cause thats where the <td><b>Outage Message</b></td> is.
size_t foundIndex = str.find(rowHtmlCloseTags); //does the sought string exist in this this line?
if (foundIndex != str.npos) //if not no position
str.replace(foundIndex, rowHtmlCloseTags.size(), replacement); //replace the string
else
std::cout << "Oops.. didn't find " << rowHtmlCloseTags << std::endl; //else throw a bitch
foundIndex = str.find(rowHtmlOpenTags); //does the sought string exist in this this line?
if (foundIndex != str.npos) //if not no position
str.replace(foundIndex, rowHtmlOpenTags.size(), replacement); //replace the string
else
std::cout << "Oops.. didn't find " << rowHtmlOpenTags << std::endl; //else throw a bitch
myMessages[i]=str;
i++;
}
}
}
system("cls");
i=0;
while (i < 10)
{
cout << i << ") " << myMessages[i] << endl;
i++;
if (myMessages[i]=="")
{
break;
}
}
myReadFile.close();
cout << endl;
cout << endl;
cout << "Enter the message you would like to see on the reader board.\n";
cout << "Or enter 911 to go back to the main menu: ";
cin.ignore(1080);
getline (cin,MessageToAdd);
if (str == "911") //go back to the main menu
{
system("cls");
mainMenu();
}
else //insert the message into a blank spot in the array
{
i=0;
while (i < 10)
{
if (myMessages[i].empty())
{
myMessages[i]=MessageToAdd;
break;
}
else
{
i++;
}
}
}
//now rebuild the htm file with the new array
CreateHtmlFile(myMessages);
}
La solution
Je vais vous dire une chose qui ne va pas immédiatement avec votre code, pas votre problème spécifique, mais un poilu quand même.
Je présume que votre fonction mainMenu()
appelle celui-ci. Dans ce cas, vous semblez être sous l'idée erronée que:
if (str == "911") //go back to the main menu
{
system("cls");
mainMenu();
}
retournera à votre menu. Il pas faire. Qu'est-ce qu'il va faire est d'appeler votre code de menu principal à nouveau et vous finirez par manquer d'espace de pile.
Je pense que ce que vous devez faire est d'avoir une boucle dans mainMenu()
et que le code ci-dessus doivent simplement utiliser return;
plutôt que d'appeler mainMenu()
récursive.
Cela et le fait que je pense que vous devriez comparerez MessageToAdd
contre "911"
plutôt que str
.
Une autre chose que je ferais serait de mettre un code de débogage temporaire:
cout << "DEBUG A\n";
i=0;
while (i < 10)
{
cout << "DEBUG B " << i << "\n";
if (myMessages[i].empty())
{
cout << "DEBUG C\n";
myMessages[i]=MessageToAdd;
break;
}
else
{
i++;
cout << "DEBUG D " << i << "\n";
}
cout << "DEBUG E\n";
}
cout << "DEBUG F\n";
et voir ce qui est imprimé. Bien sûr, vous pouvez tracer l'exécution dans un débogueur mais auriez-vous besoin de faire le travail vous-même. Si vous postez juste la sortie (100 premières lignes si elle est énorme), alors nous pouvons probablement vous dire ce qui ne va pas facilement.
En fait, je pense que votre problème est le cin.ignore
. Quand je lance votre code, rien ne fonctionne, ni Test
ni Test Test Test
. C'est parce qu'il est ignorant les premiers 1080 personnages que je suis en train d'entrer. La preuve peut être vu lorsque vous modifiez ces déclarations à:
cin.ignore(1);
getline (cin,MessageToAdd);
cout << MessageToAdd << "\n";
et vous obtenez la sortie est
lorsque vous entrez test
.
Prenez la ligne de ignore
et essayez à nouveau. Je ne suis pas certain de ce puisque vous semblez indiquer que les travaux de Test
mais je ne vois pas cela comme étant correct.
Alors, voici ce que vous devez faire (au strict minimum):
- se débarrasser de la
cin.ignore
tout à fait. - utilisation
return
plutôt quemainMenu()
. - utilisation
if (MessageToAdd == "911")
au lieu deif (str == "911")
. - laissez-nous savoir comment ça se passe alors.