Avatar billede zyxtem Nybegynder
08. juli 2003 - 00:17 Der er 13 kommentarer og
1 løsning

Scanf virker ikke

Hej

  I mit forsøg på at lære det mest basale C er jeg stødt ind i nogle problemer med scanf. Her er min kode:

#include <cstdlib>
#include <cstdio>

int main()
{
    int nummer;
    char bogstav;
    printf("Skriv et tal\n");
    scanf("%d", &nummer);

    printf("Skriv et bogstav\n");
    scanf("%c", &bogstav);  //<-- ????????????????????
   
    printf("Du skrev %d og %c", nummer, bogstav);
   
    system("pause");
    return 0;
}
   

Problemet er at brugeren aldrig får mulighed for at indtaste bogstavet... Programmet springer nærmest linien markeret med ?????? over.
Lige en ting til når jeg bytter om de to input så koden ser sådan ud:

#include <cstdlib>
#include <cstdio>

int main()
{
    int nummer;
    char bogstav;
   
    printf("Skriv et bogstav\n");
    scanf("%c", &bogstav);
   
    printf("Skriv et tal\n");
    scanf("%d", &nummer);
 
    printf("Du skrev %d og %c", nummer, bogstav);
   
    system("pause");
    return 0;
}
   
Virker det hele perfekt hvorfor det??

Nogen gode forslag (bruger dev-cpp og har programmet i c++ før)
Avatar billede erikjacobsen Ekspert
08. juli 2003 - 00:27 #1
Den læser linieskiftet som dit tegn/bogstav
Prøv at taste fx

  123t

i den første linie
Avatar billede bertelbrander Novice
08. juli 2003 - 01:07 #2
En af de basale ting i C du bør springe over er scanf. Funktionen er defekt pr. design.
Brug ALTID fgets til at læse indput fra brugeren.
Jeg har programmerert i C i mere end 12 år og det er mere end 10 år siden jeg brugte scanf sidst.
Avatar billede erikjacobsen Ekspert
08. juli 2003 - 01:18 #3
Enig, næste skridt er som du siger, at læse linie for linie med gets eller
fgets, og så måske bruge sscanf - hvis den egner sig.
Avatar billede bertelbrander Novice
08. juli 2003 - 01:48 #4
gets er også defekt pr. design; hvis man laver:

char line[XX];
gets(line);

Er der altid en eller anden bruger der vil taste et eller flere tegn for meget og gets har ingen mulighed for at vide hvornår den skal stoppe. Dette gælder uanset om man sætter XX til 80 eller 80000000000
Med fgets har man muligheden for at angive hvor mange tegn brugeren kan taste.
Avatar billede narrr Nybegynder
08. juli 2003 - 08:44 #5
Hvis du indsætter fflush(stdin); efter scanf("%d", &nummer); virker det.
Avatar billede arne_v Ekspert
08. juli 2003 - 09:01 #6
Et kode eksempel:

#include <iostream>
#include <cstdlib>
#include <cstdio>

using namespace std;

int main()
{
    int nummer;
    char bogstav;
    char buffer[100];
/* 
    cout << "Skriv et tal: ";
    cin >> nummer;
    cout << "Skriv et bogstav: ";
    cin >> bogstav;
    cout << "Du skrev " << nummer << " og " << bogstav << endl;
   
    cout << "Skriv et tal og et bogstav: ";
    cin >> nummer >> bogstav;
    cout << "Du skrev " << nummer << " og " << bogstav << endl;
*/
/*
    printf("Skriv et tal og et bogstav: ");
    scanf("%d %c", &nummer, &bogstav);
    printf("Du skrev %d og %c\n", nummer, bogstav);
*/
/*   
    printf("Skriv et tal: ");
    fgets(buffer,sizeof(buffer),stdin);
    sscanf(buffer,"%d", &nummer);
    printf("Skriv et bogstav: ");
    fgets(buffer,sizeof(buffer),stdin);
    sscanf(buffer,"%c", &bogstav);
    printf("Du skrev %d og %c\n", nummer, bogstav);
   
    printf("Skriv et tal og et bogstav: ");
    fgets(buffer,sizeof(buffer),stdin);
    sscanf(buffer,"%d %c", &nummer, &bogstav);
    printf("Du skrev %d og %c\n", nummer, bogstav);
*/
    system("pause");
    return 0;
}

udkommenter en af de 3 kode sektioner af gangen (du kan risikere
sære ting hvis du udkommenterer mere end en).

Og som du kan se så "mangler" lige præcis dit eksempel. Og det er fordi
scanf og reglerne for whitespace versus non-whitespace og linie-skift
ikke lige passer til problem-stillingen.
Avatar billede arne_v Ekspert
08. juli 2003 - 09:02 #7
PS: Hvis du vil være sikker på kun at bruge C kode, så lave et C projekt
i dev-cpp og brug kun:

#include <stdio.h>
#include <stdlib.h>

(med .h)
Avatar billede zyxtem Nybegynder
08. juli 2003 - 18:38 #8
Ok hvis den læser mit linieskift som et tegn hvorfor virker det så når jeg har byttet rundt så koden er sådanher??:

#include <cstdlib>
#include <cstdio>

int main()
{
    int nummer;
    char bogstav;
   
    printf("Skriv et bogstav\n");
    scanf("%c", &bogstav);
   
    printf("Skriv et tal\n");
    scanf("%d", &nummer);
 
    printf("Du skrev %d og %c", nummer, bogstav);
   
    system("pause");
    return 0;
}
Avatar billede arne_v Ekspert
08. juli 2003 - 18:43 #9
Fordi et linie-skift ikke er et validt tal og derfor læser
den videre.

1 = validt tal
linie-skift = validt bogstav
a = læses ikke

a = validt bogstav
linie-skift = ikke validt tal = ignorer
1 = validt tal
Avatar billede bertelbrander Novice
08. juli 2003 - 20:33 #10
>narr
Hvad der sker ved fflush(stdin) er udefineret ifølge Ansi-C standarden, og virker ikke på alle platforme.
Avatar billede arne_v Ekspert
08. juli 2003 - 20:56 #11
Avatar billede zyxtem Nybegynder
08. juli 2003 - 22:38 #12
Tror jeg holder mig til C++.... Det er meget nemmere :D
Avatar billede bertelbrander Novice
09. juli 2003 - 00:00 #13
Jeg har aldrig brugt cin, men jeg tvivler på at det er meget nemmere.
Avatar billede narrr Nybegynder
09. juli 2003 - 00:28 #14
det er i hvert fald mere sikkert.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester