Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » Abfragen ob Eingabe eine ganze Zahl ist in C » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Abfragen ob Eingabe eine ganze Zahl ist in C
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
deppensido
Doppel-As


Dabei seit: 23.12.2012
Beiträge: 144

Abfragen ob Eingabe eine ganze Zahl ist in C Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,

meine Aufgabe ist es ein C-Programm zu schreiben, welches 2 Threads laufen hat. Ein Thread erhöht pro Sekunde einen Zähler um 1 und der andere Thread nimmt Eingaben entgegen und erhöht den Zähler um die eingegebene Zahl. Beim Drücken von STRG+C kann man das Programm beenden. Das funktioniert auch alles schon bei mir.

Nun soll aber auch abgefragt werden, ob die Eingabe einer natürlichen Zahl entspricht und da spinnt bei mir das Programm total. Wenn ich z.B. einen Buchstaben eingebe. Dann wird nur noch die Meldung ausgegeben, dass eine natürliche Zahl eingegeben werden soll und das Programm reagiert auf gar nichts mehr.

Kann mir jemand sagen, woran das liegt und wie ich das Beheben kann, die Abfrage nach einer natürlichen Zahl? Vielen Dank im voraus und anbei der Code:
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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
#include <unistd.h>

void *incrementCounter(void *counter_ptr)  {
    int *counter = (int *)counter_ptr;
    while(1) {
        printf("%d\n", *counter);
        sleep(1);
        (*counter)++;
    }
}

void *readNumber(void *counter_ptr) {
    int number;
    while(1) {
        int* counter = (int *)counter_ptr;
        if(scanf("%d", &number) == 1) {
            printf("Erhöhe den Zähler um %d\n", (int)number);
            (*counter) = (*counter) + number;
        }
        else {
            printf("Es können nur natürliche Zahlen eingegeben werden!\n");
            sleep(1);
        }
    }
}

void sig_handler(int signo) {
  if (signo == SIGINT) {
      pthread_exit(NULL);
  }
}

int main () {
    int counter = 0;

    if (signal(SIGINT, sig_handler) == SIG_ERR)
      printf("\ncan't catch SIGINT\n");

    pthread_t p1, p2;
    pthread_create (&p1, NULL, incrementCounter, &counter);
    pthread_create (&p2, NULL, readNumber, &counter);

    pthread_join (p1, NULL);
    pthread_join (p2, NULL);

  printf ("\n");
  return 0;
}
17.05.2018 23:50 deppensido ist offline Beiträge von deppensido suchen Nehmen Sie deppensido in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Die fehlerhafte Eingabe wird nicht gelöscht, sondern du versuchst mit jedem scanf erneut, die Zahl zu parsen. Du musst den Eingabepuffer also manuell leeren.

Hier eine modifizierte Version:
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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
#include <unistd.h>

void *incrementCounter(void *counter_ptr)  {
    int *counter = (int *)counter_ptr;
    while(1) {
        printf("%d\n", *counter);
        sleep(1);
        (*counter)++;
    }
}

void *readNumber(void *counter_ptr) {
    int number;
    while(1) {
        int* counter = (int *)counter_ptr;
        if(scanf("%d", &number) == 1) {
            printf("Erhöhe den Zähler um %d\n", (int)number);
            (*counter) = (*counter) + number;
        }
        else {
            printf("Es können nur natürliche Zahlen eingegeben werden!\n");
            int ch;
			while ((ch = getchar()) != '\n' && ch != EOF)
				;
        }
    }
}

void sig_handler(int signo) {
  if (signo == SIGINT) {
      pthread_exit(NULL);
  }
}

int main () {
    int counter = 0;

    if (signal(SIGINT, sig_handler) == SIG_ERR)
      printf("\ncan't catch SIGINT\n");

    pthread_t p1, p2;
    pthread_create (&p1, NULL, incrementCounter, &counter);
    pthread_create (&p2, NULL, readNumber, &counter);

    pthread_join (p1, NULL);
    pthread_join (p2, NULL);

  printf ("\n");
  return 0;
}


__________________
Syntax Highlighting fürs Board (Link)
19.05.2018 09:56 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
deppensido
Doppel-As


Dabei seit: 23.12.2012
Beiträge: 144

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Danke, das funktioniert prima!
31.05.2018 19:24 deppensido ist offline Beiträge von deppensido suchen Nehmen Sie deppensido in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » Abfragen ob Eingabe eine ganze Zahl ist in C