Dead_Rabbit Skrevet 28. mars 2004 Del Skrevet 28. mars 2004 (endret) Hei igjen alle sammen, har nok et lite spørsmål på lager jeg int strlen(const char* S) //Her trenger jeg litt forklaring... { int Len=0; while (*S) //Kan jeg få en liten forklaring med *S`en? { Len++; S++; } return Len; } Skjønner jo liksom denne, men er strlen() en system funksjon eller er det bare en egendefinert en(det ser da veldig slik ut, boka er litt uklar der )... EDIT: Skjønner litt mer her nå men... Endret 28. mars 2004 av zirener Lenke til kommentar
søppel Skrevet 28. mars 2004 Del Skrevet 28. mars 2004 (endret) while(*S) ..vil si .. "så lenge vi har ett annet tegn enn 0". 0 tolkes som false, alle andre tall tolkes som true. 0 (eller \0) er som du sikkert kjenner til tegnet som brukes for å markere slutten på en c-streng: printf("Hei der \0 Hva skjer?\n"); ..skriver bare ut "Hei der ". char* s; cout << *s << endl; // skriver ut det (tegnet) s peker på cout << s << endl; // skriver ut addressen til det (tegnet) s peker på s++; // nå peker s på neste tegn http://www.augustcouncil.com/~tgibson/tutorial/ptr.html strlen er jo gjerne skrevet av noen den også, selv om det den skal gjøre er beskrevet i en standard .. boka nevner sikkert bare et eksempel på hvordan han/hun som skrev standard-biblioteket til din kompiler (glibc brukes av GCC/MinGW f.eks.) kan ha laget strlen-funksjonen. Endret 28. mars 2004 av søppel Lenke til kommentar
Dead_Rabbit Skrevet 29. mars 2004 Forfatter Del Skrevet 29. mars 2004 (endret) while(*S) ..vil si .. "så lenge vi har ett annet tegn enn 0". 0 tolkes som false, alle andre tall tolkes som true.0 (eller \0) er som du sikkert kjenner til tegnet som brukes for å markere slutten på en c-streng: printf("Hei der \0 Hva skjer?\n"); ..skriver bare ut "Hei der ". char* s; cout << *s << endl; // skriver ut det (tegnet) s peker på cout << s << endl; // skriver ut addressen til det (tegnet) s peker på s++; // nå peker s på neste tegn http://www.augustcouncil.com/~tgibson/tutorial/ptr.html strlen er jo gjerne skrevet av noen den også, selv om det den skal gjøre er beskrevet i en standard .. boka nevner sikkert bare et eksempel på hvordan han/hun som skrev standard-biblioteket til din kompiler (glibc brukes av GCC/MinGW f.eks.) kan ha laget strlen-funksjonen. Ok takker, men \0 tolkes altså som 0(usant)? For da skjønner jeg litt mer. EDIT: Pluss en ting til cout << s << endl; // skriver ut addressen til det (tegnet) s peker på Skriver ikke dette ut hele strengen? Og er det ikke sånn at: cout << &s << endl; skriver ut adressen? Endret 29. mars 2004 av zirener Lenke til kommentar
søppel Skrevet 29. mars 2004 Del Skrevet 29. mars 2004 Ehh -- jo .. Jeg surrer .. :] Lenke til kommentar
Dead_Rabbit Skrevet 29. mars 2004 Forfatter Del Skrevet 29. mars 2004 (endret) Ehh -- jo .. Jeg surrer .. :] Ok fint (jeg trordde det var jeg var helt utpå jordet ) EDIT: Skriver så utorstårlig Endret 29. mars 2004 av zirener Lenke til kommentar
<BøNilzen> Skrevet 29. mars 2004 Del Skrevet 29. mars 2004 Nei, tror ikke søppel tuller.. Er det ikke slik at cout << *s // skriver ut verdien til variabelen pekeren s peker til, cout << s // skriver ut adressen til variabelen pekeren s peker til og cout << &s // skriver ut adressen til selve pekeren s? Eller tuller jeg og nå? Lenke til kommentar
☀ ❄ Skrevet 29. mars 2004 Del Skrevet 29. mars 2004 (endret) Det stemmer det der, <BøNilzen>. søppel surra heller ikke. zirener glemte visst at s er en peker. Edit: Når jeg tenker etter er jeg sannelig ikke sikker selv. Siden s er en char* vil jeg tro at std::cout skriver ut strengen, framfor adressen. En rask sjekk viser at: #include <iostream> int main() { char* my_string = "Hello, world!\n"; int i = 5; int* pi = &i; std::cout << my_string; std::cout << i << " " << pi; std::cout << std::endl; return 0; } Som selvfølgelig gir: Hello, world! 5 0012FF88 (Der 0012FF88 kan variere). Så da viste det seg selvfølgelig at zirener ikke surra -- Vi andre glemte at s er en char*, og ikke en peker til noe annet. Endret 29. mars 2004 av Myubi Lenke til kommentar
kjetil7 Skrevet 29. mars 2004 Del Skrevet 29. mars 2004 (endret) Jepp, du tuller (litt) cout << *s //skriver ut tegnet s peker på (dvs. første bokstav i strengen) cout << s //skriver ut hele strengen cout << &s //skriver ut adressen til pekeren cout << (void*)s //skriver ut adressen pekeren peker til Endret 29. mars 2004 av kjetil7 Lenke til kommentar
Dead_Rabbit Skrevet 29. mars 2004 Forfatter Del Skrevet 29. mars 2004 Aha Er ikke så lenge siden jeg starta med pekere så det går litt i surr... Blandre litt med char* og int* hehe Lenke til kommentar
Steinbitglis Skrevet 30. mars 2004 Del Skrevet 30. mars 2004 char cstreng[128] = "streng";int tall = 2; char* strengAdresse = &cstreng; int* intAdresse = &tall; Skriver cout << intAdresse; en adresse mens cout << strengAdresse; skriver en cstreng? trodda at siden cout << strengAdresse; skrev ut det den pekte på så gjorde cout << intAdresse det også char* my_string = "Hello, world!\n";denne forvirrer meg litt, hvilken char peker denne på? Hvis den eksisterer, når forsvinner den? den er vel ikke satt opp i det frie lageret? Lenke til kommentar
☀ ❄ Skrevet 30. mars 2004 Del Skrevet 30. mars 2004 char* my_string = "Hello, world!\n"; denne forvirrer meg litt, hvilken char peker denne på? Hvis den eksisterer, når forsvinner den? den er vel ikke satt opp i det frie lageret? Pekeren peker til det første elementet, altså H'en, akkurat som med et array. Det får du også vite hvis du skriver std::cout << *my_string;. Stringen eksisterer på stack'en, og forsvinner dermed når den går ut av "scope". trodda at siden cout << strengAdresse; skrev ut det den pekte på så gjorde cout << intAdresse det også Det har vel blitt sagt allerede, men det er altså char* som er unntaket, ikke omvendt. Lenke til kommentar
søppel Skrevet 31. mars 2004 Del Skrevet 31. mars 2004 (endret) Nei, strenger allokert v.h.a., uhm, "blabla" (string litherals?) eksisterer i det statiske lageret. De blir allokert på forhånd og eksisterer fra start til slutt av programmet, og det er derfor dette går: char const* funk() { return("Hei der!"); // blir seff. det samme som å si char const* s = "Hei der!"; return(s); } int main() { cout << funk() << endl; } trodda at siden cout << strengAdresse; skrev ut det den pekte på så gjorde cout << intAdresse det også Det har vel blitt sagt allerede, men det er altså char* som er unntaket, ikke omvendt. Slå opp på "function (og operator) overloading" - det er dette som lager "unntak til regler" med hensyn til forskjellige typer her. ..f.eks.: void funk(int* a) { // gjør noe } void funk(char* a) { // gjør noe annet } template<typename T> void funk<T*>(T* a) { } void funk(MinType* a) { // osv ... osv } Endret 31. mars 2004 av søppel Lenke til kommentar
☀ ❄ Skrevet 31. mars 2004 Del Skrevet 31. mars 2004 (endret) Slå opp på "function (og operator) overloading" - det er dette som lager "unntak til regler" med hensyn til forskjellige typer her. Selvfølgelig, men for alle de andre innebygde typene gir std::cout << pbuilt_in_type; adressa til variabelen. Når én av typene, og ingen andre, har den oppførselen, heter det på norsk at den typen (char*) er et unntak. Men det hele er selvfølgelig flisespikkeri. Jeg burde vel dessuten visst at string literals allokeres i BSS, men... Errare human est. Endret 31. mars 2004 av Myubi Lenke til kommentar
d0ppler Skrevet 2. april 2004 Del Skrevet 2. april 2004 (endret) forøvrig så er strlen() en funksjon som returnerer lengden av en streng (i bytes). strlen(const char *string) as size_t EDIT :og selvfølgelig skjønte dere det... min feil Endret 2. april 2004 av dga01 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå