Gå til innhold

Lesing fra tastatur til char*


Anbefalte innlegg

Videoannonse
Annonse

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

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

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

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 av zirener
Lenke til kommentar

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

Å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 av Orjanp
Lenke til kommentar

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
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

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 av A_N_K
Lenke til kommentar

 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 av søppel
Lenke til kommentar
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

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 av A_N_K
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...