Abfragen ob Eingabe eine ganze Zahl ist in C

Neue Frage »

Auf diesen Beitrag antworten »
deppensido Abfragen ob Eingabe eine ganze Zahl ist in C

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;
}
 
Auf diesen Beitrag antworten »
eulerscheZahl

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;
}
Auf diesen Beitrag antworten »
deppensido

Danke, das funktioniert prima!
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »