Orjanp Skrevet 12. mars 2004 Del Skrevet 12. mars 2004 Jeg ønsker å lese inn fra taststur f.eks. <Hei du der>. Hvordan kan det gjøres? Er det mulig å ikke bruke en tabell til å lese inn i, men en char * variabel? Lenke til kommentar
søppel Skrevet 12. mars 2004 Del Skrevet 12. mars 2004 Tabell? Paster noe kode .. vet ikke om det er dette du er ute etter, eller om det er helt rektig (jeg koder altid i C++, ikke C): #include <stdio.h> #include <stdlib.h> // Remember to call free on string returned! char* readLine() { unsigned int num_read = 0; int c; char* buf = 0; while((c = fgetc(stdin)) != EOF && c != '\n') { num_read++; buf = (char*)realloc(buf, num_read); buf[num_read - 1] = c; } buf = (char*)realloc(buf, num_read + 1); buf[num_read] = '\0'; return(buf); } // readLine() int main(int argc, char** argv) { char* s; s = readLine(); printf("readLine(): %s\n", s); free(s); // Remebering to call free here. return(0); } // main() Lenke til kommentar
A_N_K Skrevet 12. mars 2004 Del Skrevet 12. mars 2004 En tabell kan du behandle som en peker til char (char *), men den er allokert på stacken. Aldri skriv (eller les for den saks skyld) til en peker uten at den peker til allokerte data. En hvilken som helst C-bok burde forklare dette, og mer til. Lenke til kommentar
søppel Skrevet 12. mars 2004 Del Skrevet 12. mars 2004 Tabell / Array? .. Sånn jeg har tolket det så er tabeller minst to-dimensjonale, mens arrayer er 1-dimensjonale (lister)? Eller? Lenke til kommentar
A_N_K Skrevet 12. mars 2004 Del Skrevet 12. mars 2004 (endret) Vel, arrays kalles ofte for tabeller på norsk, dessuten er det ingen ting i veien for at arrays kan være flerdimensjonale. Lister er typisk dynamiske datastrukturer bestående av pekere. Endret 12. mars 2004 av A_N_K Lenke til kommentar
Herr_Dude Skrevet 12. mars 2004 Del Skrevet 12. mars 2004 Array og tabell er vel samme greien... Samma med pekere og tabeller. Lenke til kommentar
A_N_K Skrevet 12. mars 2004 Del Skrevet 12. mars 2004 Arrays skiller seg fra pekere ved at dataene de peker på er opprettet på stacken av kompilatoren, mens pekere er løsere definert :] Lenke til kommentar
Orjanp Skrevet 14. mars 2004 Forfatter Del Skrevet 14. mars 2004 Takk for hjelpen. Da går jeg for lesing til tabell. Har et lite problem i så henseende. Når jeg leser inn til en tabell, og jeg prøver å skrive ut deg jeg leste inn, får jeg en utskrift som ser omtrent slik ut. int main(int argc, char **argv) { char string[10]; int ch; while((ch = getchar()) != EOF && ch != '\n') string[i++] = (char)ch; printf("%s", string); } Med en input på f.eks. ->: hey får jeg en output på : hey?t", der spørsmålstegnet er opp ned. Utskriften blir altså ikke kun det jeg skriver inn, men hele tabellen. Hva er et jeg gjør feil? Kan selvsagt bare telle antall tegn inn og skrive samme antall ut. Lenke til kommentar
Dead_Rabbit Skrevet 14. mars 2004 Del Skrevet 14. mars 2004 (endret) printf("%s", string); Her tror jeg feilen ligger, du må gi den en indeks, hvis ikke skriver den ut hele tabellen printf("%s", string[5]); //Bare tilfeldig at jeg valgte 5 her Er ikke sikker på om dette stemmer assa men, du kan jo prøve. EDIT:Oi tror kansje jeg missforstod litt der ja... skulle kansje ha lest inlegget litt bedre Endret 14. mars 2004 av zirener Lenke til kommentar
<BøNilzen> Skrevet 14. mars 2004 Del Skrevet 14. mars 2004 printf("%s", string[5]); //Bare tilfeldig at jeg valgte 5 her Nå skriver den val bare ut Array-Nummer 6, f.eks. hvis jeg skriver inn "sourcecode" skriver den ut "c". Lenke til kommentar
A_N_K Skrevet 14. mars 2004 Del Skrevet 14. mars 2004 Er det ikke bedre å slå opp i en referansebok (The C Programming Language) enn å spørre her for hver lille ting man støter borti (det kan fort bli et par)? Det er nytteløst å holde på med strenger i C hvis man ikke kjenner til null-terminering f.eks. Lenke til kommentar
Orjanp Skrevet 14. mars 2004 Forfatter Del Skrevet 14. mars 2004 (endret) Årsaken til at jeg spør, er at med identisk kode på to forskjellige maskiner, en med Slackware og en med RedHat, blir det forskjellig. RedHat skriver ut strengen som jeg skriver inn, mens Slackware skriver ut det som står i kode eksemplet tidligere. Derfor lurer jeg på om det er noe åpenbare feil i koden som jeg presenterte. Uansett, The C Programming Language synes jeg er litt mangelfull på lesing fra tastatur, gjelder forsåvidt også metodekall med pekere. Endret 14. mars 2004 av Orjanp Lenke til kommentar
A_N_K Skrevet 14. mars 2004 Del Skrevet 14. mars 2004 Jeg vet ikke hva du finner mangelfullt med det de fleste mener er den definitive referansen til C-språket, men fra seksjon 1.9: when a string constant like "hello\n" appears in a C program, it is stored as an array of characters containing the characters in the string and terminated with a '\0' to mark the end.Og, i seksjon 7.4 får du en innføring i scanf som tar seg av nettopp lesing fra standard inn (som regel tastatur). Lenke til kommentar
Orjanp Skrevet 14. mars 2004 Forfatter Del Skrevet 14. mars 2004 Jeg vet ikke hva du finner mangelfullt med det de fleste mener er den definitive referansen til C-språket Er klar over det, og det er også derfor jeg har den Og, i seksjon 7.4 får du en innføring i scanf som tar seg av nettopp lesing fra standard inn (som regel tastatur). Men scanf leser vel kun en token til en variabel. Har man flere token, må man ha flere variabler. Det vil si at man må på forhånd vite hvordan input ser ut, noe som ikke alltid er mulig. Når det gjelder eksemplet tidligere ved bruk av getchar i en while løkke, så fungerer det som sagt ikke helt som det skal i Slackware 9.1 med version 3.2.3 av gcc. I versjon 9.0 av Slackware med version 3.2.2 av gcc, fungerer det derimot fint. Forstå det de som kan... Får legge inn null temineringen manuellt etter at strengen er lest inn. Lenke til kommentar
A_N_K Skrevet 14. mars 2004 Del Skrevet 14. mars 2004 (endret) Du er klar over at scanf kan lese inn strenger også? Dvs. at du kan skrive scanf("%s", string); og den vil gjøre samme jobben som den manuelle løkka di (i tillegg til å nullterminere). Men det smarteste her er vel å bruke fgets, hvor du samtidig kan si fra om hvor mye plass du har i array'et ditt. Skjønner ikke helt hva du mener når du sier at getchar ikke fungerer, getchar gjør akkurat det den er ment å gjøre, dvs. å lese inn et tegn og returnere det. Nullterminering har ikke getchar noe med. Edit: Semantisk glipp. Endret 14. mars 2004 av A_N_K Lenke til kommentar
<BøNilzen> Skrevet 14. mars 2004 Del Skrevet 14. mars 2004 Hva med å bruke cin.getline() ? Lenke til kommentar
☀ ❄ Skrevet 14. mars 2004 Del Skrevet 14. mars 2004 Det er snakk om C, <BøNilzen> Lenke til kommentar
søppel Skrevet 15. mars 2004 Del Skrevet 15. mars 2004 (endret) char string[10]; int ch; while((ch = getchar()) != EOF && ch != '\n') ..du vet på forhånd at linjen er 10 tegn lang? I så fall er jo fgets() totalt overlegent .. (..og hvis det skulle vise seg at den ikke er 10 tegn lang, skjer det teite ting) Endret 15. mars 2004 av søppel Lenke til kommentar
Orjanp Skrevet 15. mars 2004 Forfatter Del Skrevet 15. mars 2004 Du er klar over at scanf kan lese inn strenger også? Dvs. at du kan skrive scanf("%s", string); og den vil gjøre samme jobben som den manuelle løkka di (i tillegg til å nullterminere). Jeg prøvde det tidligere, men fikk kun første ord fram til space. Og ifølge man sidene skal den stoppe enten ved space eller ved slutten av arrayet, avhengig av hva som kommer først. Men det smarteste her er vel å bruke fgets, hvor du samtidig kan si fra om hvor mye plass du har i array'et ditt. Skal se på denne etterhvert. Skjønner ikke helt hva du mener når du sier at getchar ikke fungerer, getchar gjør akkurat det den er ment å gjøre, dvs. å lese inn et tegn og returnere det. Nullterminering har ikke getchar noe med. På to andre maskiner legger getchar() til nulltermineringen, går iallefall ut ifra at det er det den gjør siden den kun skriver ut strengen som er skrevet inn, og ikke hele tabellen. På min maskin legges det ikke til nullterminering siden hele tabellen skrives ut uansett hvor mye jeg legger inn. Løsningen ble til slutt slik: while((ch = getchar()) != EOF && ch != '\n') string[i++] = (char)ch; string[i] = '\0'; Lenke til kommentar
A_N_K Skrevet 15. mars 2004 Del Skrevet 15. mars 2004 (endret) Ser ut som du har rett angående scanf, glemte at den stopper på mellomrom :_p Men hvis du tenker over hvordan getchar fungerer, bør det være åpenbart at du må sørge for nullterminering selv. Funksjonen leverer ett og ett tegn som du plasserer etter hverandre, inntil du ser en newline eller EOF. Hvor skal den terminerende nulllen komme inn? Endret 15. mars 2004 av A_N_K 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å