Strings - Zeichen mithilfe Variablen ersetzen
-
Hey,
gibt es eine Möglichkeit in C ein Zeichen eines strings durch ein anderes über eine Variable zu ersetzen? Also sowas in der Art:
char string[] = "strang"; char zeichen = 'i'; string[3] = zeichen; //geht ja nicht...
MfG
-
Du gehts in einer Schleife über alle chars im String.
Wenn der aktuelle char gleich dem zu ersetzenden ist, ersetze es durch das Zielzeichen.
-
string[3] = zeichen;
-
@Nathan Aber das funktioniert ja dann nur beim ersten Auftauchen des Zeichens, und nicht wenn ich mehrere habe... Aber danke schonmal, das hilft mir schon weiter
@SeppJ Sorry, sollte auch so heißen
Habs geändert
-
lprulzcrossover schrieb:
@SeppJ Sorry, sollte auch so heißen
Habs geändert
Dann ist das Problem ein Zeichen durch ein anderes zu ersetzen doch gelöst. Wo ist also das Problem?
Aus
Aber das funktioniert ja dann nur beim ersten Auftauchen des Zeichens, und nicht wenn ich mehrere habe
folgere ich mal, dass dein eigentliches Problem ist, alle Zeichen einer Art durch ein anderes zu ersetzen. Liege ich da richtig? Wieder: Wo ist das Problem dabei? Deinen Einwand gegenüber Nathans Lösungsvorschlag verstehe ich nicht. Wieso sollte das nicht mit mehreren Zeichen funktionieren?
-
Okay, also ich möchte in dem String eine Zahlenfolge mit berechneten Zahlen ablegen. Tut mir Leid, das Beispiel war etwas ungünstig, also hier:
char string[20] = ""; int z = 5 + 2; z = (char)z; //Ich dachte hiermit wäre es gelöst... string[3] = z;
Also bei mir kommen dann nur komische Zeichen auf dem Bildschirm heraus...
-
Ein Zeichen ist im Computer zwar eine Zahl, aber die Zahl 1 ist allgemein nicht das Zeichen '1' und so weiter. Und natürlich ist nicht jede Zahl ein Zeichen, da es viel mehr Zahlen im Computer gibt als Zeichen in den gängigen Zeichentabellen.
Du suchst sprintf.
Das hätte man dir übrigens auch sofort sagen können, wenn du direkt so gefragt hattest
.
-
SeppJ schrieb:
Das hätte man dir übrigens auch sofort sagen können, wenn du direkt so gefragt hattest
.
Ja, ist mir auch unangenehm grade...^^
Kann ich mit sprintf denn auch an eine bestimmte Stelle in den string schreiben (Die Zahlenfolge soll durch eine Schleife in den string geschrieben werden)?
Bei den Ergebnissen auf google wird immer nur was komplett neues in den string geschrieben...
-
Ja, du kannst einfach die gewünschte Stelle als Start an sprintf übergeben.
Du solltest dir noch dringend die Zeichenkettenverarbeitung in C nochmal genauer angucken. Das ist nicht unbedingt anfängerfreundlich und Fehler führen zum verrücktesten Verhalten zur Laufzeit (wenn es einfach abstürzt, hat man noch Glück, dann bemerkt man den fehler wenigstens). Deine bisherigen Vorschläge hier im Thread lassen mich ahnen, dass dir bei dem Thema viel fehlt und du nur rumgeraten hast.
-
SeppJ schrieb:
Du solltest dir noch dringend die Zeichenkettenverarbeitung in C nochmal genauer angucken.
Bin ja grad erst am Lernen, hab noch kaum Erfahrung damit. Ist mein erstes richtiges Programm mit strings...
Habs nun hinbekommen, danke für die Hilfe und Geduld
-
Du kannst es auch zeigen. Wie schon gesagt, fallen viele Fehler bei Zeichenkettenverarbeitung gar nicht sofort auf. Wenn du uns das Programm zeigst, können wir dir sagen, ob es wirklich richtig ist.
-
Okay, dann einmal noch für Interessierte^^:
#include <stdio.h> #include <string.h> //strlen() //Funktion zur Umkehrung eines strings (umgerechnete Zahl/string muss umgekehrt werden) char* turn(char* str1, char* str2) { int i, length; length = strlen(str1) - 1; //Länge des ursprünglichen srings ohne '\0' ; - 1, da erste Stelle im string entspricht 0 for(i = 0; i <= length; i++) //Umkehrung { str2[i] = str1[length - i]; } str2[length + 1] = '\0'; //Nullterminierung return str2; } //Umrechnungsfunktion char* basisb(long long n, int b, char* ziffern) { long long int div = n; //speichert den ganzzahligen Teiler int i, //Zähler mod; //Rest einer Division char buchst[] = "ABCDEFGHIJKLMNOPQRSUVWXYZa"; //zur Darstellung von Zahlen >= 10 als Buchstabe char* ptr; for(i = 0; div != 0; i++) { mod = div % b; //Rest ermitteln und in erg speichern ptr = &ziffern[i]; //Auf aktuelle Position im string zeigen if(mod >= 10) //Zahl als Buchstabe darstellen { sprintf(ptr, "%c", buchst[mod - 10]); } else { sprintf(ptr, "%i", mod); //für Basen < 10 } div = div / b; //ganzzahligen Teiler zur weiteren Rechnung ermitteln } return ziffern; } int main(void) { int b; //Basis long long int n; //umzurechnende Zahl char ziffern[20] = ""; //long long int maximal 20 Stellen im Dezimalzahlsystem char turned[20] = ""; //ziffern umgedreht char* ptr; //pointer zum Speichern der Rückgabewerte printf("Welche ganze Dezimalzahl soll umgerechnet werden? "); scanf("%Li", &n); do { printf("Zu welcher Basis umrechnen (2...36)? "); scanf("%i", &b); } while(b < 2 || b > 36); ptr = basisb(n, b, ziffern); //Zuweisung des pointers; ziffern[] wird belegt ptr = turn(ptr, turned); //string umdrehen und in turned ausgeben printf("%Li = %s(%i)\n", n, ptr, b); return 0; }
Habs getestet, funktioniert soweit. Verbesserungsvorschläge trotzdem immer wieder gerne
-
Wieder hättest du auch gleich nach deinem eigentlichen Problem fragen können, dann hätte man wieder sofort einen wesentlich besseren Lösungsvorschlag machen können:
const char *buchst = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for(i = 0; div != 0; i++) { ziffern[i] = buchst[div % b]; div = div / b; }
Und dann brauchst du keinerlei Fallunterscheidungen mehr und auch kein (s)printf. Das mit dem anschließenden Umdrehen kann man sich ebenfalls sparen, wenn man das Problem etwas anders angeht (Zwei Ansätze wären 1. Mathematik oder 2. Rekursion), aber da kannst du selber dran tüfteln (oder es einfach so lassen, wie es ist).