Toon posts:

[c++] word gek van getline()

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil in een console app in een loopje commando's kunnen intikken, daarvoor heb ik de volgende code gemaakt.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <string>

std::string cmd ;
int running = 1 ;

void processCommand () {
    std::string command ;

        std::cout << "processing: " << cmd << std::endl ;

    command = cmd.substr (0, cmd.find (' ')) ;

        std::cout << "command: " << command << std::endl ;

    if (command.compare ("connect") == 0) {
        running = 0 ;
    }
}

int main (int argc, char* argv []) {
    std::cout << "program started!" << std::endl ;    // debug

    // start command loop
    while (running) {
        std::getline (std::cin, cmd) ;
        processCommand () ;
    }

    return 0 ;
}


het is dus de bedoeling in main een regeltje tekst in cmd te stoppen en in processCommand wordt dan in eerste instantie het eerste woord van die regel genomen en gekeken wat dit woord is. In dit geval moet het programma stoppen als het eerste woord connect is.
Maar volgens mij zit het probleem niet in die functie maar in het getline gedeelte.
als het programma start krijg ik keurig op mn console schermpje "program started!"
als ik dan een regeltje tekst intik en op enter ram gebeurt er niks. als ik dan nog een keer een regel tik en deze wederom met enter afsluit, gaat de eerste regel naar de functie processCommand. en zo gaat na elke regel steeds de vorige regel naar de functie.

Als iemand mij kan uitleggen wat ik fout doe graag, want ik begin hier langzaam gek te worden.

[ Voor 7% gewijzigd door Verwijderd op 02-10-2003 01:18 ]


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Je programma werkt bij mij prima (linux/gcc 3.2.2).

Werkt het volgende programma wel? Het zou elke regel die je typt weer moeten printen (stoppen met Ctrl+D). Of krijg je hiermee hetzelfde verschijnsel?
C++:
1
2
3
4
5
6
7
8
9
10
11
12
#include <string>
#include <iostream>

int main()
{
    std::string str;

    while ( getline( std::cin, str))
        std::cout << str << '\n';

    return 0;
}

"He took a duck in the face at two hundred and fifty knots."


Verwijderd

Topicstarter
_Squatt_ schreef op 02 October 2003 @ 01:32:
Je programma werkt bij mij prima (linux/gcc 3.2.2).

Werkt het volgende programma wel? Het zou elke regel die je typt weer moeten printen (stoppen met Ctrl+D). Of krijg je hiermee hetzelfde verschijnsel?
Dit werkt bij mij ook niet goed. Krijg idd hetzelfde verschijnsel als in mijn programma.
Ik gebruik overigens MS visual c++

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Blijkbaar is dit een probleem van Visual C++ (misschien oudere versies?), want bij de 'sample programs' van een course vond ik dit:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//* A Sample Replacement for malfunctioning getline(..,..) for MS Visual C++ *

#include<iostream>
#include<string>
using namespace std;

void getlineFixed(istream& in, string& s, char eol='\n') {
    char ch;
    s="";
    while(in.get(ch) && ch!=eol) s+=ch;
    // hint: in.get(..) returns false if reading fails
}

int main() {
    cout << "This is a test for the fixed getline:" << endl;
    string a, b, c;
    cout << "Please enter the string 1:  ";
    getlineFixed(cin, a);
    cout << "Please enter the string 2:  ";
    getlineFixed(cin, b);
    cout << "Please enter the string 3:  ";
    getlineFixed(cin, c);

    cout << "Verifying:" << endl;
    cout << "1: " << a << endl;
    cout << "2: " << b << endl;
    cout << "3: " << c << endl;

    return(0);
}

van deze pagina.

"He took a duck in the face at two hundred and fifty knots."


Verwijderd

Topicstarter
kijk eens aan, hartelijk dank! Ik zal voor nu de getlineFixed overnemen en binnenkort eens kijken of ik ergens een update-je vandaan kan slepen. Meestal geef ik bij dergelijke problemen gelijk anderen de schuld en blijk ikzelf wat fout gedaan te hebben, nu is het ook eens andersom :P

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Klik!

De oplossing is om een kleine aanpassing te maken in een header file.

"He took a duck in the face at two hundred and fifty knots."


  • datkanveelbeter
  • Registratie: Mei 2003
  • Laatst online: 21-05 15:39
_Squatt_ schreef op 02 oktober 2003 @ 02:10:
Klik!

De oplossing is om een kleine aanpassing te maken in een header file.
Waarom kan IK weer die header niet vinden met dat stukje code erin :'(
Ik begin nu echt aan me te twijfelen 8)7
Pagina: 1