/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
String ikke indlæst - detektering af null ~
Fra : Trygleren [9000]


Dato : 22-11-02 20:20

Hej,
jeg prøver at lære C++, men er løbet ind i en væg. Hvordan tjekker man for
en nullpointer? Dvs. i javaforstand. Hvis jeg opretter en String i java og
ikke tildeler den en værdi, kan jeg teste om den er null. Hvorledes gør man
dette i C++?

Eks.
//kode start
void main()
{
string a, b;

cout << "StringComparator" << endl;

while(a==0)
{
cout << "Indtast foerste streng til sammenligning: ";
cin >> a;
}
while(b==0)
{
cout << "Indtast den anden streng til sammenligning: ";
cin >> b;
}

if(a==b)
cout << "Strengene "+a+" og "+b+" er ens.";
else
cout << "Strengene er ikke ens.");
}
//kode slut



--
"Sic gorgiamus allos subjectatos nunc"
Lars 'Trygleren' Winther

www.hesteskelet.dk




 
 
Michael Bülow Jensen (22-11-2002)
Kommentar
Fra : Michael Bülow Jensen


Dato : 22-11-02 20:37


"Trygleren [9000]" <TryglerenSLETDETHER@hesteskelet.dk> wrote in message
news:3dde8366$0$140$edfadb0f@dread12.news.tele.dk...
> Hej,
> jeg prøver at lære C++, men er løbet ind i en væg. Hvordan tjekker man for
> en nullpointer? Dvs. i javaforstand. Hvis jeg opretter en String i java og
> ikke tildeler den en værdi, kan jeg teste om den er null. Hvorledes gør
man
> dette i C++?
>
> Eks.
> //kode start
> void main()
> {
> string a, b;
>
> cout << "StringComparator" << endl;
>
> while(a==0)
> {
> cout << "Indtast foerste streng til sammenligning: ";
> cin >> a;
> }
> while(b==0)
> {
> cout << "Indtast den anden streng til sammenligning: ";
> cin >> b;
> }
>
> if(a==b)
> cout << "Strengene "+a+" og "+b+" er ens.";
> else
> cout << "Strengene er ikke ens.");
> }
> //kode slut

//Kode start
#include <string>

int main()
{
std::string a, b;

std::cout << "StringComparator" << std::endl;

while(a.empty())
{
std::cout << "Indtast foerste streng til sammenligning: ";
std::cin >> a;
}

while(b.empty())
{
std::cout << "Indtast den anden streng til sammenligning: ";
std::cin >> b;
}

if(a == b)
std::cout << "Strengene " << a << " og " << b << " er ens.";
else
std::cout << "Strengene er ikke ens.";
}
//Kode slut



Trygleren [9000] (23-11-2002)
Kommentar
Fra : Trygleren [9000]


Dato : 23-11-02 00:01

> while(a.empty())

Det går fint for strings, men jeg taler generelt. I java ( undskyld =) ) kan
man tjekke for null på næsten alle typer.
Eks.
if(minVector==null)

eller

if(minInt==null)

osv.

Er der ikke en sådan mulighed i C++?

--
"Sic gorgiamus allos subjectatos nunc"
Lars 'Trygleren' Winther

www.hesteskelet.dk





Ivan Johansen (23-11-2002)
Kommentar
Fra : Ivan Johansen


Dato : 23-11-02 01:03

Trygleren [9000] wrote:
> Det går fint for strings, men jeg taler generelt. I java ( undskyld =) ) kan
> man tjekke for null på næsten alle typer.
> Eks.
> if(minVector==null)
>
> eller
>
> if(minInt==null)
>
> osv.
>
> Er der ikke en sådan mulighed i C++?

Det er fordi næsten alting i Java er pointere (hvilket kaldes referencer
i Java). Du kan gøre det samme i C++ hvis du bruger pointere, hvilket du
bør undgå hvis det ikke er nødvendigt.

void f(int *minInt)
{
if(minInt == NULL)
{

}
}

Men husk at unødig brug af pointere giver problemer. C++ har ikke
automatisk tjek af pointere som Java har.

Ivan Johansen


Morten Brix Pedersen (23-11-2002)
Kommentar
Fra : Morten Brix Pedersen


Dato : 23-11-02 01:19

Ivan Johansen wrote:
> Det er fordi næsten alting i Java er pointere (hvilket kaldes referencer
> i Java). Du kan gøre det samme i C++ hvis du bruger pointere, hvilket du
> bør undgå hvis det ikke er nødvendigt.
>
> void f(int *minInt)
> {
> if(minInt == NULL)

Det skal lige nævnes, at mange C++ folk (blandt andet Bjarne Stroustrup)
mener at man bør bruge 0 istedet for NULL.

--
- Morten.


Mogens Hansen (23-11-2002)
Kommentar
Fra : Mogens Hansen


Dato : 23-11-02 11:34


"Trygleren [9000]" <TryglerenSLETDETHER@hesteskelet.dk> wrote in message
news:3dde8366$0$140$edfadb0f@dread12.news.tele.dk...

> Hvis jeg opretter en String i java og
> ikke tildeler den en værdi, kan jeg teste om den er null.

Her skal man lige være omhyggelig med ordvalget.

Når man i Java skriver:
String s;
opretter man _ikke_ et String objekt.
Det gælder f.eks. at der _ikke_ er kaldt nogen constructor.
Man har kun oprettet en reference, som er initialiseret til null.
Sådan forholder det sig for alle ikke simple typer (altså ikke int etc.).

Når man i C++ skriver
std::string s;
opretter man et std::string objekt.
Det vil sige at kalder default constructoren, som initialiserer s til
værdien for den tomme streng.
Sådan forholder det sig for alle typer (såfremt de har en default
constructor).

Når man i Java skriver:
String s = "Hello world!";
får man særlig hjælp fra compileren, som omskriver det til
String s = new String("Hello world!");
hvor der altså både bliver oprettet en reference til et String objekt og et
String objekt med værdien "Hello world!".
Det er specielt for String typen.

Når man i C++ skriver:
std::string s = "Hello world!"
opretter man et std::string objekt som har værdien "Hello world!", fordi der
bliver kaldt en constructor som tager en "const char*" som argument.

> Hvorledes gør
man
> dette i C++?

Jeg syntes at man i denne sammenhæng kan have glæde af at erkende at
objekter generelt har 3 aspekter:
* værdi (state)
* opførsel
* identitet

hvor de 3 aspekter vejer forskelligt afhængig af objekt typen.

F.eks. vil et bank-konto objekt have en kraftig _identitet_; selvom 2 konti
har samme saldo, er det bestemt ikke lige meget om man bruger den ene eller
den anden.
Objekter af typer med kraftig identitet kan f.eks. typisk ikke kopieres.

Et eksempel på objekter, hvor opførslen er vigtig er funktion-objekter.
F.eks. alle typer i C++ standard biblioteket, der arver fra
"std::unary_function".

Objekter som f.eks. int og std::string er domineret af deres _værdi_. Det
spiller ikke den store rolle om vi bruger den ene eller den anden integer,
men det er væsentligt hvilken værdi den har.
Sådanne objekter kan typisk kopieres, og det vil blive gjort i flæng, uden
man tænker meget over det.
En dato-klasse (som ikke er del af C++ standard biblioteket) er også et
eksempel på et værdi objekt.

Med den viden om at std::string er en værdi-type, må man forvente at den på
mange måder opfører sig som en integer.
Man kan f.eks. sammenligne værdier.
Det jeg opfatter du vil, er at vide hvornår _værdien_ af objektet er
forskellig fra _værdien_ af den tomme streng.
Altså
std::string a;

while(a == "")

Hvis man bruger member-funktionen std::string::empty, hvilket man sagtens
kan, opfatter man i højere grad string objektet som en container end som en
værdi.

Dit program bliver altså:

#include <string>
#include <iostream>

int main()
{
using std::string;
using std::cout; using std::endl;
using std::cin;

cout << "String comparator" << endl;

string a;
while("" == a) {
cout << "Enter first string:" << endl;
cin >> a;
}

string b;
while("" == b) {
cout << "Enter second string:" << endl;
cin >> b;
}

cout << (a == b ?
"The strings have the same value" :
"The strings have different value") << endl;
}



[8<8<8<]
> void main()

main returnerer _altid_ int


Venlig hilsen

Mogens Hansen





Trygleren [9000] (23-11-2002)
Kommentar
Fra : Trygleren [9000]


Dato : 23-11-02 15:39

> Jeg syntes at man i denne sammenhæng kan have glæde af at erkende at
> objekter generelt har 3 aspekter:
> * værdi (state)
> * opførsel
> * identitet
>
> hvor de 3 aspekter vejer forskelligt afhængig af objekt typen.

<SNIP>

Tak for et særdeles fyldestgørende svar. Det hjælper altid utroligt godt med
hvad der sker under overfladen, før man begiver sig videre op ad.

> Altså
> std::string a;
>
> while(a == "")

<SNIP>

Selvfølgelig (*mumler for sig selv*: stupid stupid stupid)


> > void main()
>
> main returnerer _altid_ int


Det ved jeg godt, men mit program virkede ikke ordentligt.
Så må man jo prøve sig frem med forskellige ændringer. Det er nybegynderens
lod =)

--
"Sic gorgiamus allos subjectatos nunc"
Lars 'Trygleren' Winther

www.hesteskelet.dk






Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste