Bloodshed (Dev C++) Fehler

Executor55

Lt. Commander
Registriert
Okt. 2004
Beiträge
1.699
Ich habe die neuste Bloodshed Dev C++ Version 4.9.9.2 drauf. Wenn jemand fragt wieso das und nicht irgendwas anderes: Wir programmieren damit in der Schule.

So ich bin ein totaler noob in sachen programmierung und deshalb dann es sein das der Fehler ziemlich simpel ist.
Ich kopier einfach mal den quellcode und den Fehler und ihr sagt mir dann (hoff ich) was ich falsch mache.
Der folgende Quellcode ist nur Teil einer größeren Aufgabe und habe deshalb eine einfachere Version geschrieben.

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int monat;
printf("Monat eingeben:\n");
scanf("%d", &monat);
if (monat==08){
printf ("Es ist August!\n");}

system("PAUSE");
return EXIT_SUCCESS;
}

Fehler (Message):
invalid digit "8" in octal constant (Line 11:16)

Die Fehlermeldung kommt aber nur bei der Zahl 8 und 9!?
Könnte mir jemand erklären wieso das so ist?

Danke
 
hi
programmier mit dem prog auch in der schule. dein fehler liegt in der bedingung. du kannst keine 2 zahlen reinschreiben. darfst da nur eine zahl nei setzen (wegen integer). kannst versuchen des mit Char/String/Array zu lösen.

MfG
Rolf
 
Rolf_1985 schrieb:
hi
programmier mit dem prog auch in der schule. dein fehler liegt in der bedingung. du kannst keine 2 zahlen reinschreiben. darfst da nur eine zahl nei setzen (wegen integer). kannst versuchen des mit Char/String/Array zu lösen.

MfG
Rolf

Also wenn ich mich jetzt nicht extrem irre, müsste man if (monat==8) vergleichen, weil der Compilter bei Zahlen mit vorangestellter 0 vom oktalen Zahlensystem ausgeht (wie er bei vorangestelltem x von hexadezimalem ausgehen würde) und es in diesem Zahlensystem die Ziffer 8 einfach nicht gibt.

"if (monat==8)" müsste "if (monat==010)" entsprechen, oder?
 
ints mit voran gestellter 0 werden als okt. erkannt und behandelt.
@pcw:
Stimmt int 8 ist sem. äq. mit 010
 
Danke hat funktioniert! (wieso bin ich da nicht drauf gekommen? :D )
Jetzt noch eine Frage: Kann ich in eine "if"-Bedingung 2 Bedingungen mit Operatoren setzten?
Wenn ja wie? mit "and, or, ..." oder mit "&&, ||"?
Und wie kann ich in einer "if"-Bedingung sagen "irgendwas"==vielfaches von zb. 4?
Wie schreib ich das oder muss ich in einer Funktion erst die Vielfachen berechnen?
 
Zuletzt bearbeitet:
&& bedeutet und
|| bedeutet oder

if((a+b == 2) && (f + g == 5)){
printf("Hier muss beides stimmen");

if((a+b == 2) || (f + g == 5)){
printf("Hier muss eins stimmen");

edit: if(zahl % 4 ==0)
wenn der ganzzahlige rest durch 4 == 0 ist dann zahl durch 4 teilbar.
% ist der modulo Operator

edit2: besipiel:
13 % 4 = 1
36 % 12 = 0
 
Zuletzt bearbeitet:
Muss die bedingung in klammern stehen, wenn ich nur einen wert drin stehen hab?
geht das so:
if (i==2 || i==4 || i==6){
printf("Eins von den drei muss stimmen");
}

oder muss ichs so schreiben:
if ((i==2) || (i==4) || (i==6)){
printf("Eins von den drei muss stimmen");
}
 
ob das erste geht musst du mal ausprobieren, das zweite geht auf jeden fall. lieber zuviele klammern als zuwenig (solange du den überblick behälst)

weil (i==2) = a ...
dann hast du ja: (a || b || c) = ((i==2) || (...) || (...))
 
OK das erste Beispiel hat nur mit Integer gefunzt aber egal jetzt will ich nur noch wissen wie ich ü, ö und ä ausgeben kann.
mit printf("üöä") kommt da nur ³, dann das Geteiltzeichen mit den 2 Punkten und dem Strich in der Mitte und dann noch n o mit nem geschweiftem Strich oben drüber.
Kann ich in dem printf nicht einfach ASCII-Zeichen reinschreiben? Wenn ja wie?
 
Wie kann ich "scanf" so programieren das es nach z.B. 2 Zeichen die ich hineinschreibe aufhört auf neue Zeichen zu warten (bzw das es nach zwei Zeichen aufhört ohne das ich ENTER drücke)? geht das oder gibt es da andere Befehle? Wenn ja wie heißen diese und wie funzen sie.
 
Zuletzt bearbeitet:
Nein, das geht mit Standard C/C++ nicht. Die Standard-Eingabe ist immer gepuffert und wird erst nach einem ENTER (oder evtl. genug Daten) an die Anwendung geschickt.
Es gibt betriebssystemabhängige Möglichkeiten das zu regeln. Unter *NIX z.B., indem man stdin auf unbuffered schaltet, oder die ncurses (es heißt frei übersetzt nicht umsonst "1000 Flüche" =)) Bibliothek verwendet. Unter Windows kann man die conio.h verwenden. Wenn man auf x86 Hardware arbeitet, könnte man auch BIOS-Routinen aufrufen. Eine generell immer funktionierende Variante gibt es aber afaik nicht.
 
Der einzige Weg zu einer Eingaberoutine zu kommen die genau das macht was man will ist sie selbst zu schreiben.
D.h. man braucht abhängig vom OS eine Funktion die nicht blockierend ein Zeichen von der Tastatur ausliest. Da herum kann man dann seine eigene Anwendungslogik stricken, die genau das macht was man haben will.

D.h. im Prinzip eine Schleife um ein nicht blockierendes getchar() bauen, die sich beendet wenn z.B. Enter eingegeben wird. Unerwünschte Zeichen werden einfach nicht in den Buffer übernommen..

MfG

Arnd
 
Nicht blockierend geht schon... z.B. mit select auf Deskriptor 0 (Standardeingabe). Allerdings ist diese wie schon gesagt gepuffert durch die Standardbibliothek. Das könnte man umgehen mit:
Code:
#include <stdio.h>

int main() {
  setvbuf( stdin, (char*)NULL, _IONBF, 0);
  ...
}
(Das ist reines C. Man muss in dem Falle Abstand von cin, cout, cerr nehmen, d.h. nichtmal inkludieren)

Allerdings ist es erlaubt, dass z.B. der Terminal-Treiber nochmals eine Pufferung vornimmt, wodurch selbst das Codebeispiel hier ohne Wirkung wäre.


Noch zu dem "äöü": Das ist keine Sache des Programms sondern eine Sache der Code-Page. Man sollte nach Möglichkeit solche Sachen, die tendenziell nicht bei allen Usern gleich aussehen, vermeiden. äöü sind auch nicht im ASCII-Zeichensatz enthalten. Ich glaube, erst in im ANSI-Zeichensatz. Wobei es da wiederum mehrere Kodierungen gibt.
 
Zuletzt bearbeitet:
@7H3 N4C3R da irrst du. der ascii hat die codepages eingeführt. es gibt für die ersten 127 zeichen eine einheitlichen standard, der bei ascii und ansi gleich. alles dahinter ist von der codepage bzw, von utf8 abhängig.
 
Zurück
Oben