Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C (C89, C99 und C11) ::  Merkwürdige Ergebnisse mit mehreren Texteingaben über scanf     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
dbs
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.08.2012
Beiträge: 2
Beitrag dbs Mitglied 13:04:32 17.08.2012   Titel:   Merkwürdige Ergebnisse mit mehreren Texteingaben über scanf            Zitieren

Hallo! Ich bin eigentlich sehr neu in C und wollte gerade ein paar Experimente mit Operatoren machen, als sich mir ein Problem ergab (Sorry für die Formulierung ;)). Wahrscheinlich ist mein Fehler so primitiv, dass ich mich schämen müsste, aber naja.

Wenn man in diesen Code

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int main()
{
    char mae = 0, mae2 = 0;
    scanf("%d", &mae);
    scanf("%d", &mae2);
    if (mae == 0 || (mae == 1 && mae2 >= 0))
    {
        printf("Text 1\n");
    }
    else
    {
        printf("Text 2\n");
    }
    return 0;
}


erst 2, dann 5 eingibt, so erhält man aus welchem Grund auch immer den Text 1. Ein ähnliches Problem hatte ich schon hier:

C++:
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
#include <stdio.h>
 
void main()
{
    int Art = 0;
    char z1 = 0, z2 = 0, erg = 0;
    printf("Welche Rechenart soll verwendet werden?\n");
    printf("(0 fuer Addition, 1 fuer Subtraktion, 2 fuer Multiplikation, 3 fuer Division)\n");
 
    scanf("%d", &Art);
 
    printf("Die erste Zahl bitte\n");
    scanf("%d", &z1);
 
    printf("Die zweite Zahl bitte\n");
    scanf("%d", &z2);
 
    printf("%d", Art);
 
    if (Art == 0)
    {
    erg = z1 + z2;
    printf("%d und %d ergeben zusammen %d.", z1, z2, erg);
    }
    if (Art == 1)
    {
    erg = z1 - z2;
    printf("%d und %d ergeben subtrahiert %d.", z1, z2, erg);
    }
    if (Art == 2)
    {
    erg = z1 * z2;
    printf("%d und %d ergeben multipliziert %d.", z1, z2, erg);
    }
    if (Art == 3)
    {
    erg = z1 / z2;
    printf("%d und %d ergeben dividiert %d.", z1, z2, erg);
    }
}


Ich vermute, das hat irgendetwas mit den Variablen zu tun, da diese (das habe ich schon getestet) irgendwie ihren Wert ändern, wenn ich mehrere Sachen hintereinander einlese.
Bashar
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.05.2001
Beiträge: 17821
Beitrag Bashar Mitglied 13:13:17 17.08.2012   Titel:              Zitieren

Der scanf-Formatspezifizierer %d benötigt einen Zeiger auf int. char ist zu klein dafür. Was für einen Compiler benutzt du und welche Warnungseinstellungen? Manche geben eine Warnung aus, wenn die Typen nicht zu den Formatangaben passen.

_________________
OSL♥
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 18399
Beitrag SeppJ Moderator 13:16:33 17.08.2012   Titel:              Zitieren

Wenn scanf erwartet, einen Integer schreiben zu können, an der Stelle aber nur Platz für einen char ist, dann passieren eben ungewöhnliche Dinge.

In gewissen C-Dialekten kannst du auch char als Ganzzahlen lesen (%hhd mit glibc), das ist natürlich nicht portabel. Aber wesentlich einfacher: Nimm doch int als Datentyp.

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
dbs
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.08.2012
Beiträge: 2
Beitrag dbs Mitglied 13:46:56 17.08.2012   Titel:              Zitieren

Bashar schrieb:
Der scanf-Formatspezifizierer %d benötigt einen Zeiger auf int. char ist zu klein dafür. Was für einen Compiler benutzt du und welche Warnungseinstellungen? Manche geben eine Warnung aus, wenn die Typen nicht zu den Formatangaben passen.


Vielen Dank, Leute! Das hat geholfen.

Und nein. Mein Compiler Code::Blocks hat mich nicht gewarnt. Böser Compiler! :warning:
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 18399
Beitrag SeppJ Moderator 13:55:38 17.08.2012   Titel:              Zitieren

dbs schrieb:

Und nein. Mein Compiler Code::Blocks hat mich nicht gewarnt. Böser Compiler! :warning:
Das ist kein Compiler, sondern eine IDE. Unter deinem Code::Blocks wird sicherlich ein GCC als Compiler stecken (denn wenn du diese Standardeinstellung geändert hättest, dann hättest du gewusst, dass Code::Blocks kein Compiler ist). GCC kann diese Art von Warnung schon ewig lange. Musst du nur anschalten. Gibt wahrscheinlich in der IDE irgendwo einen Schalter für Warnoptionen. Ansonsten gib dem Compiler die Kommandozeilenoption "-Wall" (evtl. auch noch "-Wextra") mit. Warnungen sollte man immer anhaben, gerade bei neueren GCCs (4.6 und neuer) sind die Warnungen sehr gut gemacht.

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List


Zuletzt bearbeitet von SeppJ am 13:55:57 17.08.2012, insgesamt 1-mal bearbeitet
c++.de :: C (C89, C99 und C11) ::  Merkwürdige Ergebnisse mit mehreren Texteingaben über scanf   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.