|
| MYSTISK problem med <string> og getline Fra : Flare |
Dato : 07-06-02 23:45 |
|
Nu fik jeg læst mit problem med F1...Når har jeg et andet...
Hvorfor virker dette kode ikke når min bog siger det gør?
----
#include<string>
string s1;
getline(cin,s1);
cout << s1;
----
Problmet er at når jeg trykker enter for at gemme linien, er det som om der
kommer et nyt inouts felt...Jeg bliver altsp nød til at trykke enter igen.
Det er dog kune det fra det første "enter" der bliver gemt i s1. Nu har jeg
vendt og drejet dette, men jeg kan sgu ikke få det til at makke ret.
PFH
Tak Anders
| |
Daniel Blankensteine~ (08-06-2002)
| Kommentar Fra : Daniel Blankensteine~ |
Dato : 08-06-02 00:02 |
|
"Flare" <dct_flare@hotmail.com> wrote in message
news:3d013780$0$57411$edfadb0f@dspool01.news.tele.dk...
> Nu fik jeg læst mit problem med F1...Når har jeg et andet...
>
> Hvorfor virker dette kode ikke når min bog siger det gør?
>
> ----
> #include<string>
> string s1;
> getline(cin,s1);
> cout << s1;
> ----
> Problmet er at når jeg trykker enter for at gemme linien, er det som
om der
> kommer et nyt inouts felt...Jeg bliver altsp nød til at trykke enter
igen.
> Det er dog kune det fra det første "enter" der bliver gemt i s1. Nu
har jeg
> vendt og drejet dette, men jeg kan sgu ikke få det til at makke ret.
Hvis du gerne vil indtaste en streng, så prøv:
char buffer[30];
cin.getline(buffer, sizeof(buffer), '\n');
Den skulle gerne virke.
mvh
db
| |
Flare (08-06-2002)
| Kommentar Fra : Flare |
Dato : 08-06-02 00:59 |
|
> Hvis du gerne vil indtaste en streng, så prøv:
> char buffer[30];
> cin.getline(buffer, sizeof(buffer), '\n');
Jeg har brug for at bruge string a forskellige årsager så char* er ikke et
alternativ
| |
Morten Brix Pedersen (08-06-2002)
| Kommentar Fra : Morten Brix Pedersen |
Dato : 08-06-02 01:25 |
|
Daniel Blankensteiner wrote:
> Hvis du gerne vil indtaste en streng, så prøv:
> char buffer[30];
> cin.getline(buffer, sizeof(buffer), '\n');
>
> Den skulle gerne virke.
Det har samme funktion som det han prøvede på, bortset fra at
cin.getline() tager et character array og getline() alene tager std::string.
- Morten.
| |
Daniel Blankensteine~ (08-06-2002)
| Kommentar Fra : Daniel Blankensteine~ |
Dato : 08-06-02 10:15 |
|
"Morten Brix Pedersen" <morten@wtf.dk> wrote in message
news:3D014EC4.7040006@wtf.dk...
> Daniel Blankensteiner wrote:
> > Hvis du gerne vil indtaste en streng, så prøv:
> > char buffer[30];
> > cin.getline(buffer, sizeof(buffer), '\n');
> >
> > Den skulle gerne virke.
>
> Det har samme funktion som det han prøvede på, bortset fra at
> cin.getline() tager et character array og getline() alene tager
std::string.
Jamen var problem ikke at han skulle trykke enter to gange? Det skal han
da ikke her.
Men hvad er egentlig forskellen på en char* og en string?
mvh
db
| |
Morten Boysen (08-06-2002)
| Kommentar Fra : Morten Boysen |
Dato : 08-06-02 12:21 |
|
"Daniel Blankensteiner" <db@traceroute.dk> wrote in message
news:adshv7$kav$1@sunsite.dk...
> Men hvad er egentlig forskellen på en char* og en string?
std::string er en klasse, som er en del af ISO C++. Den styrer selv
hukommelsesallokeringen, og sørger dermed for, at den vokser, hvis der
ikke er plads nok. På den måde risikerer man ikke buffer-overflows.
Udover det, så er der overloadet en del af operatorerne for klasse, så
at man kan sammenligne std::string med ==, !=, > og <. Derudover kan
man konkatanere to std::string med + og +=. Der er ærlig talt ikke
rigtig nogen grund til at bruge char*. Hvis du er tvivl, om hvad du
skal bruge, så brug std::string. Det samme kan siges om std::vector i
forhold til f.eks. int-arrays. Arrays og pointers er roden til alt
ondt.
--
Morten Boysen
| |
Daniel Blankensteine~ (08-06-2002)
| Kommentar Fra : Daniel Blankensteine~ |
Dato : 08-06-02 12:26 |
|
"Morten Boysen" <morten.boysen@aub.dk> wrote in message
news:adspa3$d8f$1@sunsite.dk...
> "Daniel Blankensteiner" <db@traceroute.dk> wrote in message
> news:adshv7$kav$1@sunsite.dk...
> > Men hvad er egentlig forskellen på en char* og en string?
>
> std::string er en klasse, som er en del af ISO C++. Den styrer selv
> hukommelsesallokeringen, og sørger dermed for, at den vokser, hvis der
> ikke er plads nok. På den måde risikerer man ikke buffer-overflows.
> Udover det, så er der overloadet en del af operatorerne for klasse, så
> at man kan sammenligne std::string med ==, !=, > og <. Derudover kan
> man konkatanere to std::string med + og +=. Der er ærlig talt ikke
> rigtig nogen grund til at bruge char*. Hvis du er tvivl, om hvad du
> skal bruge, så brug std::string. Det samme kan siges om std::vector i
> forhold til f.eks. int-arrays. Arrays og pointers er roden til alt
> ondt.
Oki, takker*S*
mvh
db
| |
Bertel Lund Hansen (08-06-2002)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 08-06-02 13:05 |
| | |
Ivan Johansen (08-06-2002)
| Kommentar Fra : Ivan Johansen |
Dato : 08-06-02 17:10 |
|
Bertel Lund Hansen wrote:
> Morten Boysen skrev:
>>forhold til f.eks. int-arrays. Arrays og pointers er roden til alt
>>ondt.
> ... og til alt godt. Du vil bare gerne have dem camoufleret.
Som Scott Meyers siger:
POINTERS ARE YOUR ENEMIES because they lead to the kind of problems that
auto_ptr is designed to eliminate.
POINTERS ARE YOUR FRIENDS because operations on pointers can't throw.
Ivan Johansen
| |
Morten Brix Pedersen (08-06-2002)
| Kommentar Fra : Morten Brix Pedersen |
Dato : 08-06-02 01:24 |
|
Flare wrote:
> ----
> #include<string>
> string s1;
> getline(cin,s1);
> cout << s1;
> ----
> Problmet er at når jeg trykker enter for at gemme linien, er det som om der
> kommer et nyt inouts felt...Jeg bliver altsp nød til at trykke enter igen.
> Det er dog kune det fra det første "enter" der bliver gemt i s1. Nu har jeg
> vendt og drejet dette, men jeg kan sgu ikke få det til at makke ret.
Mener du at der ikke kommer en newline til sidst?
mbp /testcode$ ./getline
dette er en test
dette er en testmbp /testcode$
mbp /testcode$
Hvis det er det du mener, så må du jo bare udprinte en newline selv.
Hvis du vil ikke kun vil hente en linje kan du bruge while():
#include<string>
using namespace std;
int main()
{
string s1;
while (getline(cin, s1)) {
cout << s1 << endl;
}
}
- Morten.
| |
Flare (08-06-2002)
| Kommentar Fra : Flare |
Dato : 08-06-02 19:05 |
|
DET var satans. Jeg har fundet problemet. Det er sgu en bug i <string> i
Vc++ 6.0.
http://people.msoe.edu/~taylor/resources/msvc60.htm
Det løser problemet. Bare ikke helt i mit tilfælde. Jeg bruger mysql++ til
database adgang og når jeg tilføjer denne header kommer problemet tilbage.
Det er sgu noget være MØJ. Og det er ikke fordi mysql++ ændre i <string>
igen (heldigvis)
Anders
| |
|
|