Seite 1 von 1
Alternative zu strcat
Verfasst: Sa Jun 18, 2011 5:17 pm
von canlot
Hallo zusammen.
Gibt es eine Möglichket wie man Zeichen nacheinander in den String speichern kann, außer strcat() ?
Re: Alternative zu strcat
Verfasst: Sa Jun 18, 2011 5:23 pm
von cloidnerux
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.
Re: Alternative zu strcat
Verfasst: Sa Jun 18, 2011 5:31 pm
von canlot
Und wie fügt man den Zeichen ein (in den String)?
Ich bin (noch) ein Anfänger daher die Frage

Re: Alternative zu strcat
Verfasst: Sa Jun 18, 2011 6:05 pm
von cloidnerux
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.
Re: Alternative zu strcat
Verfasst: Sa Jun 18, 2011 8:51 pm
von Xin
Schau mal im C-Tutorial unter Array oder Strings rein - eventuell dyn. Speicherverwaltung, da wird das als Erläuterung gemacht, was Du brauchst.
Re: Alternative zu strcat
Verfasst: So Jun 19, 2011 12:01 am
von canlot
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?
Re: Alternative zu strcat
Verfasst: So Jun 19, 2011 9:52 am
von hofian
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.
Re: Alternative zu strcat
Verfasst: So Jun 19, 2011 12:53 pm
von canlot
Jo das Eingabepuffer. Hab ich gemerkt. Als Lösung verwende ich fflush(stdin) <- die Funktion entleert den Eingabepuffer.