[C++] onbepaald aantal woorden lezen met scanf

Pagina: 1
Acties:

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
Ik wil in c++ iets maken zonder cin, omdat ik iostream.h niet heb. Daarom dacht ik aan getchar() echter mijn app gaat vrolijk door zonder ooit bij mijn getchar loop je te komen. Dit is mijn eerste app in c++ dus ik ben een n00p.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SetOwnerName()
{
    char line[80],ch;
    int c = 0;

    clrscr();
    printf("%s \n",setownername);

    do
    {
      ch = getchar();
      line[c] = ch;
      c++;
    }
    while(ch != '\n');
    c = c-1;
    line[c] = '\0';
}

Steun Elkaar, Kopieer Nederlands Waar!


  • [ti]
  • Registratie: Februari 2000
  • Niet online
Wat je hier geprogrammeerd hebt is nogal broken.

Kijk eens in de help files bij kbhit() getch() - Ook moet je ervoor zorgen dat je niet meer dan 79 tekens inleest, anders ga je op je stack schrijven, en dan stort de boel in elkaar.

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
Ja ik begrijp dat het er een beetje vaag uit ziet...
maar alle code die ik probeer gaat mijn progie gaat gewoon door... zonder te wachten op invoer...

Das het grote probleem!

(Het vorige ding wat ik invoer is een 2 met een enter er achter)

De onderstaande code werkt wel appart in een apparte file maar niet mijn programma.
code:
1
2
3
4
5
6
7
char a;

printf("\nEnter Your FName & Last Name:");
fflush(stdin);
scanf("%[^\n]",a);

printf("\nThe Name Entered is %s\n",a) ;

Steun Elkaar, Kopieer Nederlands Waar!


  • [ti]
  • Registratie: Februari 2000
  • Niet online
gebruik es gewoon getch() ipv getchar() in die code daarboven dan?

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
code:
1
2
3
4
root@kinkrsoftware:~/eon/divelog# gcc divelog.c
/tmp/ccdhWlYl.o: In function `SetOwnerName':
/tmp/ccdhWlYl.o(.text+0x315): undefined reference to `getch'
collect2: ld returned 1 exit status

hiervoor een verklaring?

Steun Elkaar, Kopieer Nederlands Waar!


  • [ti]
  • Registratie: Februari 2000
  • Niet online
Mja, gcc :P
code:
1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main()
{
  char tekst[80];
  fgets(tekst, 79, stdin);
  printf("U voerde in: %s", tekst);
  return 0;
}

Dat hele lusje is niet nodig. Dit doet als het goed is wat je wilt. (En doet nog aan length checking ook :) )

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
helaas... :( hij gaat er nogsteeds voorbij :(

Het werkt wel appart maar als ik het in een functie zet slaat het gewoon een de invoer stap over.

Steun Elkaar, Kopieer Nederlands Waar!


  • [ti]
  • Registratie: Februari 2000
  • Niet online
Mja, dan gaat er ergens anders iets fout lijkt me.

Misschien roep je je functie niet goed aan, of verwacht je dat je die functie aangeroepen gaat worden maar zit er een conditie voor waardoor dat niet gebeurd?

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
Wilde net replyen...

Het gaat mis in het switch statent... nu ik die er heb uitgesloopt werkt het. Maar daar zou ik wel ff een oplossing voor willen hebben (ik kan altijd nog if gebruiken).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
EditComputer()
{
    char menuoption;
    clrscr();
    printf("%s\n\n",editcomputer);
    printf("%d. %s \n",1,showcurrentinfo);
    printf("%d. %s \n",2,setownername);
    printf("%d. %s \n",3,setdatarate);
    printf("%d. %s \n",4,mainmenu);
    menuoption=getchar();
    SetOwnerName();
    /*
    switch(menuoption)
    {
    case '1':
        ShowCurrentInfo();
        break;
    case '2':
        SetOwnerName();
        break;
    case '3':
        SetDatarate();
        break;
    case '4':
        break;
    default:
      EditComputer();
    }*/
}

Steun Elkaar, Kopieer Nederlands Waar!


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23:59
Op zondag 02 december 2001 19:58 schreef Skinkie het volgende:
Ik wil in c++ iets maken zonder cin, omdat ik iostream.h niet heb.

Huh, met welke compiler werk jij dan?

[Oeps]
Probeer het eens met:
code:
1
#include<iostream>

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
Op maandag 03 december 2001 09:29 schreef farlane het volgende:
Op zondag 02 december 2001 19:58 schreef Skinkie het volgende:
Ik wil in c++ iets maken zonder cin, omdat ik iostream.h niet heb.

Huh, met welke compiler werk jij dan?

[Oeps]
Probeer het eens met:
code:
1
#include<iostream>
Een vrij uitgekleede versie van GCC op een 486 die als webserver draait ;) (met 250mb HD) :)

Maar misschien kan iemand mij vertellen waarom dit switch statement:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
EditComputer()
{
    char menuoption;
    clrscr();
    printf("%s\n\n",editcomputer);
    printf("%d. %s \n",1,showcurrentinfo);
    printf("%d. %s \n",2,setownername);
    printf("%d. %s \n",3,setdatarate);
    printf("%d. %s \n",4,mainmenu);
    menuoption = fgetc(stdin);

    switch(menuoption)
    {
    case '1':
        ShowCurrentInfo();
        break;
    case '2':
        SetOwnerName();
        break;
    case '3':
        SetDatarate();
        break;
    case '4':
        break;
    default:
      EditComputer();
    }
}

er voor zorgt dat als ik 2 in ram... mijn input in SetOwnerName(); niet laat uitvoeren? (De boel compilied dus wel alleen gaat de code er gewoon voorbij. Ben er sinds gisteren mee bezig.
code:
1
2
3
4
5
6
7
8
9
10
11
12
SetOwnerName()
{
    char tekst[80];
    clrscr();
    printf("%s \n ",setownername);
    printf("\n%s\n",enterpersonalinfo);
    fflush(stdin);
    fgets(tekst, 79, stdin);
    printf("%s %s", youentered, tekst); //eerst wat typen

    exit(0); //progie eindigd
}

Ik gaat jullie wat sterkers vertellen... nergens wacht mijn progie voor input :( hoe laat je een programma in vredes naam voor input wachten? een do loop?

Steun Elkaar, Kopieer Nederlands Waar!


  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 24-07 15:57
Easy :)

Omdat het char dat je invoert niet de '2' is die je switch verwacht... het character '2' heeft als decimale waarde '50'.
Als je voor die switch nog eens doet:
code:
1
 menuoption -= 48;

dan zou het wel moeten werken *D

(character '0' heeft als decimaal waarde 48, '1' heeft 49, enz.)

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""


Verwijderd

Op maandag 03 december 2001 23:29 schreef VyperX het volgende:
Als je voor die switch nog eens doet:
code:
1
 menuoption -= 48;

dan zou het wel moeten werken *D

(character '0' heeft als decimaal waarde 48, '1' heeft 49, enz.)
In zo'n geval kun je beter
code:
1
menuoption -= '0';

gebruiken om een zogenaamd 'magic number' in je source code te voorkomen.

  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 24-07 15:57
Hmmm... weer wat geleerd! :)

Maar waarom ie niet wacht bij die fgetc .... :?

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""


  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
Maar waarom hij niet wacht bij fgetc
DAT DOET IE WEL! Alleen vervolgens bij fgets gaat ie gewoon door.

Kijk ik gebruik in mijn switch statement ' ' dus dan slaat die -48 nergens op, die zou je toch alleen moeten gebruiken als je die haken weglaat ofniet?

Maar wat ik gewoon niet kan begrijpen waarom die vervloekte code niet stopt en als ik het appart compileer het wel werkt.

Ik kan iemand wel de hele code toeuren... roep maar wanneer iemand er tijd/zin in heeft.

Steun Elkaar, Kopieer Nederlands Waar!


  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 24-07 15:57
Ik wil er op zich wel even naar kijken... (hoewel ik verder geen kaas gegeten heb van c++, alleen van c)

Let me know..

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""


Verwijderd

Heb je je wel eens afgevraagd waarom je bij die fgetc op enter moet drukken om het getal 1-4 te bevestigen? Dit terwijl je maar 1 teken leest met fgetc... En daar zit ook het probleem volgens mij. Via stdin kun je als gebruiker alleen dingen per regel intoetsen. Als jij dan '2',enter intoetst, leest fgetc het eerste teken uit de invoerbuffer, dus een '2'. Dan roep je wel degelijk SetOwnerName aan, maar die ziet dat er nog steeds een enter in de invoerbuffer staat, dus de fgets die daar staat geeft gewoon een lege string. De oplossing: in het menu niet 1 teken lezen met fgetc, maar een hele regel met fgets.
Pagina: 1