[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:
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..
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.