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!

StackOverflow https://stackoverflow.com/questions/3146351

  •  01-10-2019
  •  | 
  •  

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);
}
Était-ce utile?

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 que mainMenu().
  • utilisation if (MessageToAdd == "911") au lieu de if (str == "911").
  • laissez-nous savoir comment ça se passe alors.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top