Ergebnis 1 bis 2 von 2

Thema: [C] Segmentation Fault bei Char-Array - Aber wieso?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    [C] Segmentation Fault bei Char-Array - Aber wieso?

    Hallo,

    ich sitze gerade an einer Übungsaufgabe, die eigentlich relativ einfach sein sollte. Seltsamerweise kriege ich aber Segmentation Faults, ohne zu wissen wieso.

    Aufgabenstellung war ein gegebenes Programm, dass Rentenversicherungsnummern einliest und als CSV wieder ausgibt, sicherer zu machen. Unter anderem sollten auch ungültige Nummern abgelehnt werden.

    Folgendes ist der Code:
    PHP-Code:
    int isDigit(char c) {
        if (
    47 59)
            return 
    1;
        else
            return 
    0;
    }

    int isChar(char c) {
        if (
    64 91
            return 
    1;
        else if (
    96 123)
            return 
    1;
        else
            return 
    0;
    }

    int main(int argcchar *argv[]) { 
        
    char csv[14] = "-------------";
        
    char temp[7] = "------";
        
    char ok NULL;
        
    char c='\0';
        
    int endei;
        
    0;
        
    ende 0;
        while (
    ende==0) {
        
    ok fgets(csv13stdin);
        
    printf("Input eingelesen: %s\n"csv);
        
    // Fehler beim einlesen der Daten, oder EOF erreicht
        
    if (ok==NULL) {
            
    ende=1;
            break;
        }
        
    // Überprüfen der erwarteten Zahlenwerte, ob dort auch Zahlen vorliegen
        
    for (i=08i++) {
            if (!
    isDigit(csv[i])) {
                
    ende=2;
                break;
            }
        }
        
    printf("Input auf Zahlen ueberprueft\n"); // Wird noch ausgeführt
        
    if (!isChar(csv[8])) { // Hier hakt es offensichtlich
            
    printf("Fehler bei Buchstaben\n"); // Wird nicht ausgeführt
            
    ende 3;
            break;
        }
        
    printf("Input auf Buchstabe uebeprueft"); // Wird nicht ausgeführt
    // .... 
    Interessanterweise tritt der Fehler nach dem Aufruf der Funktion isChar auf, das hier zuletzt gezeigte printf wird nicht mehr ausgeführt. Zuerst habe ich gedacht es liegt daran, dass csv[8] auf einen ungültigen Speicherbereich verweist, aber der Fehler tritt auch auf, wenn ich die 8 durch zB 2 ersetze, ein Aufruf der in der vorherigen for-Schleife problemlos funktioniert.
    Die isChar-Funktion selber überprüft nur (wie die isDigit-Funktion) ob der Charakter zwischen zwei bestimmten Grenzen liegt, also nichts was eigentlich einen Speicherfehler produzieren sollte.
    Ich bin momentan total überfragt woran der Fehler noch liegen könnte, meine C-Erfahrung ist aber auch nur relativ gering (und liegt schon was länger zurück).

    Edit:
    Fehler gefunden (und behoben). csv[8] gibt nur den Charakter als Integer zurück. Eine eigene Funktion die mir einen Teilstring zurückliefert (Start-Index und länge angegeben) hat das Problem behoben.
    Falls jemand ein ähnliches Problem hat..

    Geändert von MagicMagor (03.05.2011 um 18:39 Uhr) Grund: Fehler gefunden

  2. #2
    Die Funktionen isDigit() und isAlpha() (deine isChar()) sind in der ctype.h definiert. Die brauchst du gar nicht mehr selbst schreiben.

    Zum Programm selbst:
    Da man anscheinend nur eine Rentenversicherungsnummer eingeben muss, wäre es doch besser, diese gleich als Parameter dem Programm zuzuweisen. Das spart die lästige Eingabe und man kann diesen Vorgang sogar automatisieren.
    Breaks werden in der strukturellen Programmierung nicht gerne gesehen, da sie die Programmstruktur zerbrechen.

    Zum Problem:
    Dein Problem ist deine isChar() Funktion. C unterstützt keine Mehrfachbedingungen.
    Der C-Compiler macht daraus folgendes:
    aus if (64 < c < 91) wird if ((64 < c) < 91)

    wenn ich jetzt nach einem kleinen d (dezimal 100) abfrage, passiert folgendes:
    64 < 100 = 1
    1 < 91 = 1

    Nehm ich jetzt mal die Zahl 2 (dezimal 50), passiert das:
    64 < 50 = 0
    0 < 91 = 1

    Das Ergebnis wird immer 1 sein.

    Und deswegen führt er deine Abfrage nie aus.
    Entweder du nimmst die vorhandene Funktion oder du schreibst:
    if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))

    edit:
    ein Char ist in C immer eine 1 Byte große Zahl.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •