einlesefunktion soll bindestrich irgonrieren

wannabe_nerd

Lieutenant
Registriert
Mai 2009
Beiträge
753
Hi leute folgendes Problem:

Ich programmiere in C (c99) und will ein String (um genau zu sein eine ISBN) in ein array einlesen. Der String/ die isbn besteht entweder nur aus zahlen oder aus zahlen mit bindestrichen dazwischen.

Da ich nachher mit den Werten innerhalb des Strings rechnen will, sollten nach möglichkeit beim einlesen die bindestriche ignoriert werden.

ich hatte mir das zunächst so gedacht:

Code:
void erfasse_isbn(char isbn[])
{
  unsigned int i = 0;

          int isbn_laenge = 0;
          scanf("%30s[^\n]", isbn);
           
          isbn_laenge = strlen(isbn);
                    
          for(i = 0; i < strlen(isbn); i++)
            {
              if(isbn[i] == 45)
                {               
                  isbn[i] = 48;
                }
            }
  printf("\n%s <-- ISBN\n\n", isbn);  
}

so aber wird dem bindestrich immer der wert 0 zugewiesen, was aber leider bei der nachfolgenden rechnung zu fehlern führt -.-'

Habt ihr eine idee, wie ich scanf dazu überreden kann die bindestriche beim einlesen sozusagen zu überspringen?

mfg wannabe_nerd
 
Zuletzt bearbeitet:
Du könntest mit einem hilf Array arbeiten und den eingebenen String in diesen Kopieren dabei vergleichst du jedes Zeichen vor dem Kopieren und wenn ein bindestrich auftritt soll er einfach den Zähler erhöhen ohne das zeichen zu kopieren und beim nächsten zeichen weiter machen, so sollten sich alle binde striche aus sortieren lassen.
 
Folgende Code Zeile unter "scanf("%30s[^\n]", isbn);" setzen.

isbn = isbn.Replace("-", "");
 
Hi Leute,

also ich habs jetzt mit einem Hilfs-Array gelöst.

Das sieht dann jetzt wie folgt aus:

Code:
void erfasse_isbn(char isbn[], char isbn_bereinigt[])
{
   int j = 0;
          int isbn_laenge = 0;
          scanf("%30s[^\n]", isbn);
          isbn_laenge = strlen(isbn);
          for( int i = 0; i < isbn_laenge; i++)
             {
              if ( isdigit(isbn[i]) != 0 )
                {
                 isbn_bereinigt[j] = isbn[i];
                 j++;
                }
             }     
                          
  printf("\n%s <-- ISBN ohne Bindestriche\n\n", isbn_bereinigt);
  printf("\n%s <-- ISBN\n\n", isbn);  
}

Jetzt funktioniert es wie es soll! Super Danke leute....

Ich bin jetzt nur am überlegen, ob ich das ganze noch so anpasse, dass auch Leerzeichen verarbeitet werden können.
So wie es jetzt da steht wird das Array nämlich nur bis zum ersten Leerzeichen befüllt. Aber dazu habe ich so gar keine idee und da ich etwas unter zeitdruck stehe, halte ich mich einfach an den Grundsatz: Never touch a running system! :D

Aber solltet ihr noch eine Anregung bzw. eine Idee haben wie soetwas aussehen könnte haben, immer her damit^^


Nochmal THX CBler^^
 
Zuletzt bearbeitet:
Also eigentlich ist das wenn ichs richtig verstandne habe doch lediglich noch eine Bedingung mehr in deiner Abfrage bei if ( isdigit(isbn) != 0 )

Einfach prüfen ob isbn != hexCode von Leerzeichen bzw. ' ' müsste auch gehen?!
Zumal ich das auch mit dem hexCode beim Bindestrich bzw. != '-' abgefragt hätte statt ne isdigit() funktion aufzurufen ;)

Allerdings bin ich mir momentan nicht bewusst, dass eine ISBN Leerzeichen hat, kann mich aber auch irren.

MfG
 
mit hexcode meinst du den ASCII-Wert des jeweiligen Zeichens?

Das hatte ich ja zunächst auch probiert, aber das Problem liegt nicht in der if-abfrage sondern bei scanf. Denn scanf liest irgendwie nur bis zum ersten Leerzeichen und gibt das ganze dann als die ISBN aus (Z.B. : ISBN 3 4564 34534 nach meinem jetzigem Stand wäre laut meines Programms die ISBN : 3
-.-'

Ich hab eben die Idee gehabt, dass man die Werte auch als einzelne int-Werte einzulesen
nach dem Schema: scanf("%s %s %s ...") war aber nur ein fixer Gedankengang zwischen zwei Brötchen xD
 
Achso, ich dachte du liest einfach eine komplette ISBN mit scanf().
und willst dann daraus die Leerzeichen und Bindestriche entfernen.

Ich weiß jetzt allerdings nicht wie der Inhalt deiner Datei/Eingabe aufgebaut ist, weil bei der Form "ISBN X XXXX XXXXX" hätte ich einfach von ISBN bis zum Ende eingelesen, diesen String entsprechend mittels substring zerlegt und danach den die Nummern ausgelesen.

Und ja ich meine ASCII ;)
 
ja das ist ja was ich eigentlich möchte: dass das ganze als EIN String einlesen wird und dann damit weiter gearbeitet wird (ich möchte dann die Prüfziffer berechnen bzw. die ISBN auf richtigkeit überprüfen - die formel dazu hab ich aus wiki geholt^^)
Dabei soll es dann egal sein, ob man die ISBN mit oder ohne Leerzeichen und mit oder ohne Bindestriche eingibt:

ISBN 1-23-4567-8910 soll genauso behandelt werden wie:
ISBN 1 23 4567 8910 oder
ISBN 12345678910

(die Eingabe erfolgt in jedem Fall ohne ein Vorangestelltest ISBN ;-) )

Aber genau das macht mein scanf nicht. Es liest hier z.b. nur bis zum ersten leerzeichen und gibt mir dann als ISBN aus: 1

Ich hoffe jetzt ist klar geworden was ich will bzw. was ich meine^^
 
Zuletzt bearbeitet:
Dessen bin ich mir bewusst ;)

Nur müsste man eben wissen woher du die ISBN einliest und wie der Inhalt der Datei ist, denn es gibt je nachdem verschiedene Methoden.

Evtl. hasde aber auch die fscan() methode falsch parametriert?
Hab grade kurz in der API geschaut:

1.Paremeter:
Whitespace character: the function will read and ignore any whitespace characters (this includes blank spaces and the newline and tab characters) which are encountered before the next non-whitespace character. This includes any quantity of whitespace characters, or none

Also korrekt eingestellt werden sogar die Leerzeichen automatisch entfernt?!
Wo ist das Problem? :-)
 
Also ich möchte das nicht aus einer Datei herauslesen, sondern über eine Eingabe in der Konsole. Außerdem weiß ich nicht, wo ich diese API richtig einstelle.... vielleicht sollte ich dazu sagen, dass ich unter Linux mit dem gcc compiler programmiere^^

Sry bin noch Anfänger und daher noch nicht so bewandert mit Programmieren im allgemeinem und insbesondere C ist mir manchmal noch ein Rätsel =)
 
wannabe_nerd schrieb:
Sry bin noch Anfänger und daher noch nicht so bewandert mit Programmieren im allgemeinem und insbesondere C ist mir manchmal noch ein Rätsel =)

Dann leg ich dir dieses Buch ans Herz:

http://en.wikipedia.org/wiki/The_C_Programming_Language_(book)

Achte auf die "Second Edition".

Und zusätzlich gibt es noch ein gutes Anfänger-Tutorial von Mark Virtue ("C Programming"). Allerdings meine ich die Version von 2001 ^^

gruß
hostile
 
Die API musst du nirgends richtig einstellen, sieh es als Dokumentation / Anleitung zum verwenden von vorgegebenen Klassen / Metoden.

Auf der folgenden Seite findest du die Anleitung zu deiner gewünschten Methode scanf:
http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

Es gibt einen Parameter für die Funktion, der ihr sagt, was sie zu tun hat und zwar der 1., der 2. ist dein Array wo der ganze Inhalt reinkommt.

Der 1. Parameter wird wie du ja weißt mittels String übergeben. und hat folgenden Aufbau:

"%[*][width][modifiers]type"

D.h. den musst du an der richtigen Stelle entsprechend abändern und dann sollte es funktionieren, welche Stelle das ist verrat ich aber nicht, sonst wärs ja nicht mehr interessant ;)
 
Also nachdem ich mich jetzt einwenig eingelesen habe in scanf und wie man es einstellt, komme ich nur zu dieser Lösung:

Code:
void erfasse_isbn(char isbn[], char isbn_bereinigt[])
{
   int j = 0;
          int isbn_laenge = 0;
          scanf("%*[^ ]%30s[^\n]", isbn);
          isbn_laenge = strlen(isbn);
          for( int i = 0; i < isbn_laenge; i++)
             {
              if ( isdigit(isbn[i]) != 0 )
              {
                 isbn_bereinigt[j] = isbn[i];
                 j++;
              }
             }     
                          
  printf("\n%s <-- ISBN ohne Bindestriche\n\n", isbn_bereinigt);
  printf("\n%s <-- ISBN\n\n", isbn);  
}

Leider immernoch ohne echten Erfolg: als ISBN wird mir dieses mal lediglich '3' angezeigt :-(

Das bedeutet, scanf hat bis zum ersten Leerzeichen eingelesen, das Eingelesene Verworfen und dann das nächste Zeichen in das Array geschrieben.
Jetzt bin ich wieder total verwirrt, ich hatte die bedeutung von:
scanf("%*[^ ]%30s[^\n]", isbn);

so verstanden, dass alles außer dem, was in den eckigen Klammern steht eingelesen werden soll.

Was ist nun das Problem? ich verstehe es echt nicht...

Könntet ihr bitte einem C-N00b einen weiteren tipp geben? xD

thx

Mfg Wannabe_nerd
 
Ok also geht das, was ich will mit scanf nicht. Aber zu "fgets" habe ich eine Frage: soweit ich das sehen kann wird fgets nurzum auslesen von strings aus Dateien angewendet oder?

Wie funktioniert fgets bei der Eingabe von Werten über die Tastatur? Von der Verwendung von gets wird ja meistens abgeraten, da es mehrere kritische Fallstricke beinhalten soll.

Was sagt ihr dazu?
 
Standard C unterscheidet nicht zwischen den verschiedenen Arten der Streams. Daher liest fgets(my_string,my_buffer_size,stdin); aus der Standardeingabe (normalerweise Tastatur) ein oder auch fprintf(stdout,...) ist das gleiche wie printf(...) und fscanf(stdin,...) ist das gleiche wie scanf(...). Analoges gilt auch für Netzwerksockets und Pipes.

EDIT: Nochmal deutlich: stdin ist der Handle deiner Standardeingabe. stdout der der Standardausgabe. stderr für die Standardfehlerausgabe.
 
Zurück
Oben