Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

beliebig langen String einlesen in c

Diskussion: beliebig langen String einlesen in c im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hallo C Freunde ! Ich habe da ein kleines Problem: Ich möchte gerne einen Sring über die Console einlesen ...

Antwort
Alt 12.11.11, 17:51   #1 (permalink)
 
Registriert seit: 23.08.11
Old_Pirate Leistung: Facit NTK
Likes: 0
Standard beliebig langen String einlesen in c

Anzeige

Hallo C Freunde !

Ich habe da ein kleines Problem: Ich möchte gerne einen Sring über die Console einlesen das ganze in Array speichern und dann einen bestimmten Buchstaben der ebenfalls über die Konsole eingelesen wird suchen und ausgeben wie oft diers im Text vorkommt.

Habe das auch teilweise gelöst habe folgendes gemacht:

Code:
#include <stdio.h>
#include <stdlib.h>

#define maxleng 200

int zaelen(char* arr, char letter)
{
    int i=0;

    int count=0;

    while(arr[i]!= '\0')
    {
    
        if(letter== arr[i])
        {
            count++;
        }
        
    i++;
    
    }

    return count;    

}

int main (void)
{
    char* eingabe=(char*)malloc(sizeof(char));
    char b= ' ';

    

    printf("Bitte geben Sie einen Text ein!\n");
    

    fgets(eingabe,maxleng,stdin);
    

    printf("Bitte geben Sie den zu suchenden Buchstaben ein\n");
    
    scanf("%c",&b);
    
    printf("%i\n",zaelen(eingabe, b));
    
    free(eingabe);    

    return 0;
    
}
So nun zwei Probleme:

1. Der String soll ja beliebig lang sein aber wie mache ich das den fgets erwartet ja eine Länge von mir ? deshalb ist er im moment noch mit maxlaeng begrenzt

2. Wenn ich free benutze wird meine Console mit Fehlermeldungen überflutet:

*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x0844d008 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0xb76ff591]
/lib/tls/i686/cmov/libc.so.6(+0x6cde[0xb7700de8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0xb7703ecd]
./a.out[0x8048615]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb76aabd6]
./a.out[0x80484a1]
======= Memory map: ========

aber warum wenn ich speicher mit malloc allokiere muss ich diesen doch wieder mit free() Freigeben ?

Danke im Vorraus für eure Hilfe!
Old_Pirate ist offline   Mit Zitat antworten
Alt 12.11.11, 18:16   #2 (permalink)
Senior Member
 
Benutzerbild von lookshe
 
Registriert seit: 10.03.07
lookshe Leistung: 8086
Likes: 19
Standard

Also für dein erstes Problem gäbe es die Lösung, alle Zeichen selbst einzulesen und dynamisch zu allozieren. Ein Beispiel dazu hab ich im Forum schonmal gepostet, hier ein Link zum Post.

Zu deinem zweiten Problem habe ich spontan auch keine Lösung, aber es gibt bei der Fehlermeldung ein Haufen Ergebnisse bei Google, evtl. ist da etwas dabei. Einen Fehler sehe ich jedenfalls nicht. Allerdings frage ich mich, warum du fgets verwendest, statt gets, welches sowieso von STDIN liest und zudem eine Prüfung vor Pufferüberlauf drin hat.
lookshe ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 13.11.11, 12:19   #3 (permalink)
Themenstarter
 
Registriert seit: 23.08.11
Old_Pirate Leistung: Facit NTK
Likes: 0
Standard

Hallo lookshe!

Danke für deine Antwort allerdings habe ich probleme deinen Code zu verstehn bzw Teile davon es wäre net wenn du mir auf die Sprünge helfen könntest.

Nun ich möchte nicht das ganze nochmal Posten. Also sag ich kurz so wie ich es meine Verstanden zu haben und Poste nur die Stückchen mit dennen ich Probleme habe.

Also so wie ich das sehe allozierst (by the way: heißt das nun allokieren oder allozieren ?) du zuerst speicher mit malloc dann kommt eine fehlerbehandlung und dann überprüfst du ob ein Zeichen mit dem Wert 13 eingegeben wurde (ist glaub ich Cariage Retrun also neue Zeile) falls nicht überprüfst du ob zahlen buchstaben usw eingeben wurden dann zählst du die inputlänge hoch. Falls die länge die Maxlange übersteigt erweitertst du den speicher mit realloc bei backspace oder escape wird alles zurückgesetz also neue Eingabe. So das war jetzt das ganze in Grob ich hoffe das passt so jetzt zu meinem Fragen.

Was übergibst du mit input show_input
Code:
char* read_input(int show_input, char* input_text)
bzw für was brauchst du das ??

warum setzt du inputArray anfänglich auf NULL würde da die Fehlerprüfung nicht reichen ?

Code:
char* inputArray = NULL;
und warum setzt du bei inputArray an Stelle [0] ein EOF ?

außerdem kann ich folgenden zwei Abfragen nicht ihren Sinn entlocken
(also ich weiß Sie haben einen Sinn und ich weiß auch das das ein If ist aber ich versteh es einfach nicht )
Code:
return (inputLength?inputArray:NULL);
putchar(show_input?input:'*');
Sorry für den langen Text und sorry falls dumme Fragen bei sind aber ich bin noch nicht so Fit in C.

Danke für deine Hilfe!
Old_Pirate ist offline   Mit Zitat antworten
Alt 13.11.11, 12:42   #4 (permalink)
Senior Member
 
Benutzerbild von lookshe
 
Registriert seit: 10.03.07
lookshe Leistung: 8086
Likes: 19
Standard

Zitat:
Zitat von Old_Pirate Beitrag anzeigen
Also so wie ich das sehe allozierst (by the way: heißt das nun allokieren oder allozieren ?) du zuerst speicher mit malloc dann kommt eine fehlerbehandlung und dann überprüfst du ob ein Zeichen mit dem Wert 13 eingegeben wurde (ist glaub ich Cariage Retrun also neue Zeile) falls nicht überprüfst du ob zahlen buchstaben usw eingeben wurden dann zählst du die inputlänge hoch. Falls die länge die Maxlange übersteigt erweitertst du den speicher mit realloc bei backspace oder escape wird alles zurückgesetz also neue Eingabe. So das war jetzt das ganze in Grob ich hoffe das passt so jetzt zu meinem Fragen.
Richtig, du hast also soweit den Code verstanden.

Zitat:
Zitat von Old_Pirate Beitrag anzeigen
Was übergibst du mit input show_input
Code:
char* read_input(int show_input, char* input_text)
bzw für was brauchst du das ??
Das show_input wird übergeben, da diese Methode auch für Passworteingabe benutzt wurde und dort möchte man das Passwort ja nicht auf dem Bildschirm sehen.

Zitat:
Zitat von Old_Pirate Beitrag anzeigen
warum setzt du inputArray anfänglich auf NULL würde da die Fehlerprüfung nicht reichen ?
Ich initialisiere meine Variablen immer, da ich sonst nicht weiss, was sie wirklich enthalten und das kann u.U. zu interessanten Fehlern zur Laufzeit führen, wo man lange sucht. (Ist mir zumindest auf Arbeit schon öfter passiert)

Zitat:
Zitat von Old_Pirate Beitrag anzeigen
Code:
char* inputArray = NULL;
und warum setzt du bei inputArray an Stelle [0] ein EOF ?
Ich terminiere den String einfach nur, warum ich das genau gemacht habe, weiss ich auch nicht mehr. Zudem müsste es eigentlich nach der folgenden if-Abfrage kommen. Aber irgendeinen Grund hatte es.

Zitat:
Zitat von Old_Pirate Beitrag anzeigen
außerdem kann ich folgenden zwei Abfragen nicht ihren Sinn entlocken
(also ich weiß Sie haben einen Sinn und ich weiß auch das das ein If ist aber ich versteh es einfach nicht )
Code:
return (inputLength?inputArray:NULL);
putchar(show_input?input:'*');
Gut, dass es ein if ist, hast du ja schonmal verstanden. Also machen wir auch mal eines draus:
Code:
if (inputLength) {
   return inputArray;
} else {
   return NULL;
}

if (show_input) {
   putchar(input);
} else {
   putchar('*');
}
Beide Code-Abschnitte machen genau das gleiche, spart nur ein paar Zeilen und ist für jemanden, der mit dem Ternären Operator vertraut ist schneller zu lesen.

Zitat:
Zitat von Old_Pirate Beitrag anzeigen
Sorry für den langen Text und sorry falls dumme Fragen bei sind aber ich bin noch nicht so Fit in C.

Danke für deine Hilfe!
Für sowas braucht man sich doch nicht entschuldigen, du hast was nicht verstanden und nachgefragt
Ich hoffe ich konnte helfen.


/Edith hat die Antwort auf deine Frage wegen dem allokieren oder allozieren gefunden:

http://de.wikipedia.org/wiki/Allokat...)#Sprachliches
Allokation = Substantiv
allozieren = Verb

Geändert von lookshe (13.11.11 um 12:45 Uhr)
lookshe ist offline   Mit Zitat antworten
Alt 13.11.11, 13:08   #5 (permalink)
Themenstarter
 
Registriert seit: 23.08.11
Old_Pirate Leistung: Facit NTK
Likes: 0
Standard

Hallo Lookshe!

Danke ich glaube ich habe es nun verstanden... ich werde nun zur nächsten Phase schreiten und das ganze versuchen nach zu Basteln damits auch wirklich sitzt.

Falls doch noch Probleme Auftreten sollten werde ich diesen Thread einfach um ein paar Fragen erwetiern
Old_Pirate ist offline   Mit Zitat antworten
Alt 13.11.11, 15:30   #6 (permalink)
Themenstarter
 
Registriert seit: 23.08.11
Old_Pirate Leistung: Facit NTK
Likes: 0
erledigt

Hallo ich noch mal

So das mit den Strings einlesen funzt super... Danke!

Ich wollte das ganze natürlich auch gleich praktisch Anwenden und möchte nun einen String von der Konsole einlesen und diesen Dann in eine .txt speichern.

Das einlesen und ausgeben funzt super wenn ich folgendes mache:

Code:
   
  char text[]={"Bitte geben Sie einen Text ein!\n"};
    
char* bla = read(text);

int i=0;

while(bla[i] != '\0')
    {
        printf("%s",bla[i]);    
        i++;

    }
So nun möchte ich das ganze aber in die .txt schreiben also kommt noch FILE usw hinzu (das lass ich mal weg weil das funzt ja )
und besagtes stück wird so geändert:

Code:
while(bla[i] != '\0')
    {
        fprintf(log,bla[i]);    
        i++;

    }
So nun ist einfach das problem das fprintf nur echte Strings animmt also nur "... " auch so etwas wie :
Code:
 fprintf(log,bla);
geht nicht! Wie kann ich also nun das was in meinem array bla steht in die .txt datei schreiben ???
Old_Pirate ist offline   Mit Zitat antworten
Alt 13.11.11, 15:53   #7 (permalink)
Senior Member
 
Benutzerbild von lookshe
 
Registriert seit: 10.03.07
lookshe Leistung: 8086
Likes: 19
Standard

Also meines Wissens und der Referenz von fprintf nach, arbeitet es wie printf, also sollte folgendes eigentlich richtig sein:

Code:
fprintf(log,"%s",bla);
Du kannst mit den printfs übrigens char-Arrays einfach mit %s und dem Namen des Arrays ausgeben lassen und musst nicht jeden Character einzeln machen.
lookshe ist offline   Mit Zitat antworten
Alt 13.11.11, 16:41   #8 (permalink)
Themenstarter
 
Registriert seit: 23.08.11
Old_Pirate Leistung: Facit NTK
Likes: 0
Standard

Hi Lookshe!


Danke so funzt es!
Old_Pirate ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » beliebig langen String einlesen in c
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Das Geheimnis eines langen Lebens… -= pillepalle =- Fun Section 0 13.06.11 21:35
String einlesen und Zeichen zählen Mjoelnir Code Kitchen 39 15.08.10 17:53
[C++] Programm stürzt bei zu langen Dateinamen ab Extinction Code Kitchen 0 07.01.08 14:49
String mit Doppelnamen einlesen und sortieren Tobse Code Kitchen 7 17.05.06 12:58
string einlesen - vc 6 nidda Code Kitchen 2 05.02.06 15:18


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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61