Alternative zu strcat

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Alternative zu strcat

Beitrag von canlot » Sa Jun 18, 2011 5:17 pm

Hallo zusammen.
Gibt es eine Möglichket wie man Zeichen nacheinander in den String speichern kann, außer strcat() ?
Unwissenheit ist ein Segen

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Alternative zu strcat

Beitrag von cloidnerux » Sa Jun 18, 2011 5:23 pm

Indem du dich selber darum kümmerst, das du genug freien Speicherplatz (malloc/free) hast und dann einfach hinter dem letzten Zeichen des Strings deine zeichen einfügst.
Redundanz macht wiederholen unnötig.
quod erat expectandum

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Alternative zu strcat

Beitrag von canlot » Sa Jun 18, 2011 5:31 pm

Und wie fügt man den Zeichen ein (in den String)?
Ich bin (noch) ein Anfänger daher die Frage :D
Unwissenheit ist ein Segen

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Alternative zu strcat

Beitrag von cloidnerux » Sa Jun 18, 2011 6:05 pm

Ein string ist ein Array aus Chars.
Somit werden einfach alle Zeichen hintereinander in den RAM gelegt. Und um das effizient zu halten, wird dazu oft Pointer verwendet(char *str).
Willst du jetzt etwas hinzufügen, musst du deinen Speicherbereich erweitern und dann hinter das letze Zeichen deines Strings deine weiteren Zeichen anfügen. Das ist das was strcat auch macht.
Sprich, du berechnest die Länge deines strings(alle Zeichen bis zum '\0'), berechnest die länge des Strings den du anfügen möchtest, forderst neuen Speicher mit malloc an, der groß genug ist, kopierst den ersten String in den neuen Speicher und dann fügst du den zweiten String hinten an.

Dein Problem, das du mit strcat warscheinlich hast, ist das es zu langsam ist, wenn du einzelne Zeichen anfügen willst. Weil du ewig nur am Kopieren bist.
Wenn du das effizienter machen willst, solltest du entweder berechnen wie viele Zeichen insgesamt du anfügen willst oder einfach generell Zusatzspeicher mit zu allozieren. Damit sparst du dir häufiges Kopieren.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Alternative zu strcat

Beitrag von Xin » Sa Jun 18, 2011 8:51 pm

Schau mal im C-Tutorial unter Array oder Strings rein - eventuell dyn. Speicherverwaltung, da wird das als Erläuterung gemacht, was Du brauchst.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Alternative zu strcat

Beitrag von canlot » So Jun 19, 2011 12:01 am

cloidnerux hat geschrieben:Dein Problem, das du mit strcat warscheinlich hast, ist das es zu langsam ist, wenn du einzelne Zeichen anfügen willst. Weil du ewig nur am Kopieren bist.
Das hast du richtig erkannt. Ich denke das strcat langsam ist, weil es mit strings arbeitet und nicht mit Zeichen. Ich habe eben eine Anternative programmiert die aber leider nicht so funktioniert wie ich es möchte.

Code: Alles auswählen

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

    void char_to_string(char character, char *string, int *array_size)
    {
        (*array_size)++;
        int temp = *array_size;
        string = realloc(string, temp * sizeof(char));
        *(string + (temp - 1)) = character;
        *(string + temp) = '\0';
    }

    int main(void)
    {
        int counter = 0;
        char character;
        int array_size = 0;
        char *string = malloc(array_size * sizeof(char));

        while(counter < 5)
        {
            scanf("%c",&character);
            char_to_string(character,string,&array_size);
            counter++;
        }
        printf("\n%s",string);
        
        return 0;
    }

Ich will hier 5 char werte nacheinander einlesen.
Die char Werte werden zu den String hinzugefügt.
In der schleife selbst kann ich merkwürdigerweise aber nur 3 mal char einlesen.
Kann mir bitte jemand erklären warum das so ist?
Unwissenheit ist ein Segen

hofian
Beiträge: 62
Registriert: Do Sep 24, 2009 6:59 pm

Re: Alternative zu strcat

Beitrag von hofian » So Jun 19, 2011 9:52 am

Nun, das liegt am Eingabepuffer.

Alle Eingaben (bei dir durch scanf) sind zeilengepuffert, d.h. sie werden erst verarbeitet wenn der Benutzer <Enter> gedrückt hat. Dabei wird das \n an den Puffer angefügt. Befindet sich schon ein \n am Ende des Puffers, wartet scanf gar nicht erst auf die Eingabe des Benutzers, sondern macht einfach weiter. Gehen wir mal dir Schleife fünf mal durch:

Code: Alles auswählen

1. Eingabepuffer: "a\n"  <scanf>  character: "a" Eingabepuffer jetzt: "\n"
2. Eingabepuffer: "\n"    <scanf>  character: "\n" Eingabepuffer jetzt: ""  <-- hier wird scanf scheinbar übersprungen
3. Eingabepuffer: "b\n"  <scanf>  character: "b" Eingabepuffer jetzt: "\n"
4. Eingabepuffer: "\n"    <scanf>  character: "\n" Eingabepuffer jetzt: ""  <-- hier wird scanf wieder scheinbar übersprungen
5. Eingabepuffer: "c\n"  <scanf>  character: "c"  EIngabepuffer jetzt: "\n"
Zur Lösung des Problems empfehle ich dir den Eintrag zum Eingabepuffer im FAQ
Darin wird noch einmal der Eingabepuffer erklärt und (weiter unten) Lösungsvorschläge angeboten.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Alternative zu strcat

Beitrag von canlot » So Jun 19, 2011 12:53 pm

Jo das Eingabepuffer. Hab ich gemerkt. Als Lösung verwende ich fflush(stdin) <- die Funktion entleert den Eingabepuffer.
Unwissenheit ist ein Segen

Antworten