Hallo zusammen.
Gibt es eine Möglichket wie man Zeichen nacheinander in den String speichern kann, außer strcat() ?
Alternative zu strcat
Alternative zu strcat
Unwissenheit ist ein Segen
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Alternative zu strcat
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
quod erat expectandum
Re: Alternative zu strcat
Und wie fügt man den Zeichen ein (in den String)?
Ich bin (noch) ein Anfänger daher die Frage
Ich bin (noch) ein Anfänger daher die Frage

Unwissenheit ist ein Segen
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Alternative zu strcat
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.
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
quod erat expectandum
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Alternative zu strcat
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Alternative zu strcat
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.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.
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;
}
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
Re: Alternative zu strcat
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:
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.
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"
Darin wird noch einmal der Eingabepuffer erklärt und (weiter unten) Lösungsvorschläge angeboten.
Re: Alternative zu strcat
Jo das Eingabepuffer. Hab ich gemerkt. Als Lösung verwende ich fflush(stdin) <- die Funktion entleert den Eingabepuffer.
Unwissenheit ist ein Segen