
Zitat von
Leange
Etwa das gleiche was wacked gemacht hat aber mit regulären ausdrücken
Viele, viele Möglichkeiten um das gleiche Ziel zu erreichen ^^
Leange
Edit: Ok is dochn bissel was anderes

Eigentlich wollte ich mich darüber beschweren das du keine negativen oder Zahlen mit exponent einlesen kannst, aber dann:
Code:
$ wget https://pastebin.com/raw/URrEWHma
$ mv URrEWHma leange.cpp
$ g++ -std=c++11 -o x leange.cpp
$ ./x
terminate called after throwing an instance of 'std::regex_error'
what(): regex_error
Aborted (core dumped)
$ g++ --version
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.

Zitat von
Einstein
...
Es ist schon sehr interessant zu sehen wie eine eigentlich einfache Frage "Input = Zahl ? True Close, Not true ask again" einiges an umdenken und code mit sich bringt. Ich werde es auf jeden fall versuchen hin zu kriegen und dabei so viel mit zu nehmen wie es geht

Das ist halt scheiße das "input parsen", also (Eingabe)daten korrekt interpretieren eine der schwersten Sachen ist die es beim Programmieren gibt *und* gleichzeitig die erste die man braucht.

Zitat von
Einstein
Wenn ich das richtig sehe?
Eine Schleife die überprüft ob eine
Integer == Ganzzahl eingegeben wurde, wenn
JA dann close, wenn
NEIN dann
return 0; um die abfrage zu wiederholen mit den gleichen "Parameter bzw. abfrage"
PHP-Code:
while(1) {
int ret = scanf("%d", &a);
// could an int be read?
if (ret == 1) {
break;
}
Und wenn ich z.b das hier entferne schreibt er die Zahl nur 1 mal so wie es glaube ich sein sollte, aber warum das so ist kann ich nicht sagen.
PHP-Code:
else {
/* remove the unparsed data from stdin, so the next call to scanf
doesn't read the same data again
todo: find out why fflush(stdin) doesn't work */
getchar();
}
}
std::cout << a << '\n';
}
Mfg Einstein
Naja es ist eine Schleife bei der 3 Sachen passieren können:
a) es wurde eine Zahl eingegeben --> break;
b) das wo die Zahl von gelesen werden soll ist ("stdin" = Standard Input) funktioniert nicht mehr oder sagt das da jetzt nix mehr kommen kann -> return 0
c) es wurde etwas eingegeben, war aber keine Zahl -> der Rest.
Zu a) scanf() ist sowas wie die C version von std::cin. Du kannst da mehrere Parameter angeben und dann wird auf Benutzerinput gewartet. Irgendwie sowas hier:
Code:
float a;
int b, c, ret;
ret = scanf("%f%d%d", &a, &b, &c);
(Diese %X geben an was für ein Variablentyp erwartet wird, was die &-Zeichen da sollen kommt viel später) Und in ret steht dann wie viele dieser Variablen mit dem erwarteten Typ besetzt werden konnten. Also in dem Beispiel soll erst eine Kommazahl, dann zwei Integer eingegeben werden. Und wenn das erste schon keine Kommazahl ist dann hört die Funktion einfach auf und gibt 0 zurück --> 0 Eingaben passten mit dem erwarteten Variablentyp zusammen bevor es zum ersten Fehler kam. Wenn man "12.345 a 1" oder so eingeben würde, wäre ret == 1, da die Kommazahl noch geklappt hat aber dann beim ersten Integer unerwarter Text war.
Das ist der große Unterschied zu std::cin (das macht einfach fröhlich weiter) und quasi das Herzstück von dem Code.
Aber: scanf() lässt die Daten die es nicht parsen konnte im buffer. Wenn ich also einmal einen Buchstaben eingebe wird danach jeder Versuch eine Zahl einzulesen fehlschlagen. Bis:
* ein scanf() versucht Buchstaben zu lesen und die dann noch vorhandenen Daten akzeptiert
* man den Buffer löscht (das wollte ich eigentlich mit fflush() machen, ging aber nicht...)
* getchar() oder ein anderer Befehl den Buchstaben da rausnimmt.