Welche Funktion besteht darin, einen Teilstring aus einem String in C zu ersetzen?
94
Mit einer ( char *) Zeichenfolge möchte ich alle Vorkommen eines Teilstrings finden und durch eine alternative Zeichenfolge ersetzen. Ich sehe keine einfache Funktion, die dies erreicht <string.h>.
Ich bezweifle, dass Sie dies auf veränderliche Weise tun können
user44511
Antworten:
87
Das Optimierungsprogramm sollte die meisten lokalen Variablen entfernen. Der tmp-Zeiger dient dazu, sicherzustellen, dass strcpy den String nicht durchlaufen muss, um die Null zu finden. tmp zeigt nach jedem Aufruf auf das Ende des Ergebnisses. (Siehe Shlemiel, den Algorithmus des Malers, warum strcpy nervig sein kann.)
// You must free the result if result is non-NULL.char*str_replace(char*orig,char*rep,char*with){char*result;// the return stringchar*ins;// the next insert pointchar*tmp;// variesint len_rep;// length of rep (the string to remove)int len_with;// length of with (the string to replace rep with)int len_front;// distance between rep and end of last repint count;// number of replacements// sanity checks and initializationif(!orig ||!rep)return NULL;
len_rep = strlen(rep);if(len_rep ==0)return NULL;// empty rep causes infinite loop during countif(!with)
with ="";
len_with = strlen(with);// count the number of replacements needed
ins = orig;for(count =0; tmp = strstr(ins, rep);++count){
ins = tmp + len_rep;}
tmp = result = malloc(strlen(orig)+(len_with - len_rep)* count +1);if(!result)return NULL;// first time through the loop, all the variable are set correctly// from here on,// tmp points to the end of the result string// ins points to the next occurrence of rep in orig// orig points to the remainder of orig after "end of rep"while(count--){
ins = strstr(orig, rep);
len_front = ins - orig;
tmp = strncpy(tmp, orig, len_front)+ len_front;
tmp = strcpy(tmp, with)+ len_with;
orig += len_front + len_rep;// move to next "end of rep"}
strcpy(tmp, orig);return result;}
@jmucchiello: Verwenden Sie size_tanstelle von intfür beliebige Objekt- / Zeichenfolgengrößen und -indizes. Und was ist der Zweck strcpy(tmp, orig);am Ende? Es scheint falsch.
Alexey Frunze
@Alex, der letzte Strcpy (tmp, orig) kopiert den letzten Teil des Strings zum Ziel. Beispiel: Ersetzen ("abab", "a", "c") am Ende der Schleife, Ergebnis enthält "cbc" und orig zeigt auf das letzte "b" in "abab". Der letzte Strcpy hängt das "b" an, sodass der zurückgegebene String "cbcb" ist. Wenn nichts mehr zu kopieren ist, sollte orig auf das ASCIIZ der Eingabezeichenfolge zeigen.
jmucchiello
Vereinfachung: Sie können diese erste forSchleife durch ersetzen for (count = 1; ins = strstr(ins + rep_len, rep); ++count) {}und werden dann tmpnur zum Schreiben verwendet.
Seien Sie gewarnt, dass diese Funktion NULL zurückgibt, wenn keine zu ersetzenden Vorkommen vorhanden sind (if (! (Ins = strstr (orig, rep))) gibt NULL zurück;). Sie können nicht nur die Ausgabe verwenden, sondern müssen auch überprüfen, ob die Ausgabe NULL ist, und in diesem Fall die ursprüngliche Zeichenfolge verwenden (kopieren Sie nicht einfach den Zeiger auf die Ergebniszeichenfolge, da free (result) dann die ursprüngliche Zeichenfolge freigibt). Die Verwendung ist einfacher, wenn die Eingabezeichenfolge nur in die Ausgabezeichenfolge kopiert wird, wenn nichts zu ersetzen ist.
Adversus
18
Dies wird in der Standard-C-Bibliothek nicht bereitgestellt, da Sie mit nur einem Zeichen * den der Zeichenfolge zugewiesenen Speicher nicht erhöhen können, wenn die Ersatzzeichenfolge länger als die zu ersetzende Zeichenfolge ist.
Sie können dies einfacher mit std :: string tun, aber selbst dort wird es keine einzelne Funktion für Sie tun.
1 / strlen (char *) + 1 entspricht nicht unbedingt der Speichergröße. 2 / Es gibt viele N Versionen von Zeichenfolgenfunktionen, die einen zusätzlichen Parameter für die Puffergröße empfangen. Es gibt also keinen Grund, warum es keinen snreplace () geben könnte. 3 / Es könnte eine Funktion zum Ersetzen vor Ort und keine Funktion zum Ersetzen vor Ort geben. 4 / Wie funktioniert Sprintf? Es hat ein char * -Argument und muss die Speicherzuordnung nicht erhöhen, daher kann kein Ersatz auch nicht funktionieren ... (obwohl C ein schlechtes "String" -Design hat und die Puffergröße immer übergeben werden sollte mit dem Zeiger => snprintf)
Steven Spark
12
Es gibt keinen.
Sie müssten Ihre eigenen mit etwas wie strstr und strcat oder strcpy rollen.
Wo werden Fan-Sammlungen häufig verwendeter Funktionen gespeichert? Sicher gibt es schon eine Bibliothek dafür ...
Pacerier
1
strcat()ist ein schlechter Vorschlag.
Iharob Al Asimi
11
Sie können Ihre eigene Ersetzungsfunktion mit strstr erstellen, um die Teilzeichenfolgen zu finden, und strncpy, um Teile in einen neuen Puffer zu kopieren.
Wenn das, was Sie möchten, nicht replace_withdie gleiche Länge hat wie das, was Sie möchten replace, ist es wahrscheinlich am besten, einen neuen Puffer zum Kopieren der neuen Zeichenfolge zu verwenden.
Da Zeichenfolgen in C nicht dynamisch wachsen können, funktioniert die Ersetzung an Ort und Stelle im Allgemeinen nicht. Daher müssen Sie Platz für eine neue Zeichenfolge zuweisen, die genügend Platz für Ihre Ersetzung bietet, und dann die Teile aus dem Original sowie die Ersetzung in die neue Zeichenfolge kopieren. Zum Kopieren der Teile würden Sie strncpy verwenden .
Die Puffergröße kann größer als die Zeichenfolge sein, die Ersatzzeichenfolge kann kleiner als die ersetzte Zeichenfolge sein. Daher müssen Sie keinen Speicher zuweisen, um das Ersetzen durchzuführen. (Auch auf Mikrocontrollern haben Sie möglicherweise nicht unendlich viel Speicher, und Sie müssen möglicherweise das Ersetzen an Ort und Stelle durchführen. Kopieren Sie alles in einen neuen Puffer ist möglicherweise nicht die richtige Lösung für alle ...)
Steven Spark
8
Hier ist ein Beispielcode, der dies tut.
#include<string.h>#include<stdlib.h>char* replace(charconst*const original,charconst*const pattern,charconst*const replacement
){size_tconst replen = strlen(replacement);size_tconst patlen = strlen(pattern);size_tconst orilen = strlen(original);size_t patcnt =0;constchar* oriptr;constchar* patloc;// find how many times the pattern occurs in the original stringfor(oriptr = original; patloc = strstr(oriptr, pattern); oriptr = patloc + patlen){
patcnt++;}{// allocate memory for the new stringsize_tconst retlen = orilen + patcnt *(replen - patlen);char*const returned =(char*) malloc(sizeof(char)*(retlen +1));if(returned != NULL){// copy the original string, // replacing all the instances of the patternchar* retptr = returned;for(oriptr = original; patloc = strstr(oriptr, pattern); oriptr = patloc + patlen){size_tconst skplen = patloc - oriptr;// copy the section until the occurence of the pattern
strncpy(retptr, oriptr, skplen);
retptr += skplen;// copy the replacement
strncpy(retptr, replacement, replen);
retptr += replen;}// copy the rest of the string.
strcpy(retptr, oriptr);}return returned;}}#include<stdio.h>int main(int argc,char* argv[]){if(argc !=4){
fprintf(stderr,"usage: %s <original text> <pattern> <replacement>\n", argv[0]);
exit(-1);}else{char*const newstr = replace(argv[1], argv[2], argv[3]);if(newstr){
printf("%s\n", newstr);
free(newstr);}else{
fprintf(stderr,"allocation error\n");
exit(-2);}}return0;}
Es funktioniert, aber es ist ein bisschen fehlerhaft, aber trotzdem danke! : D Hier ist eine, die ich gefunden habe und die sehr gut funktioniert. Coding.debuntu.org/… Prost ! :)
Joe DF
4
// Here is the code for unicode strings!int mystrstr(wchar_t*txt1,wchar_t*txt2){wchar_t*posstr=wcsstr(txt1,txt2);if(posstr!=NULL){return(posstr-txt1);}else{return-1;}}// assume: supplied buff is enough to hold generated textvoidStringReplace(wchar_t*buff,wchar_t*txt1,wchar_t*txt2){wchar_t*tmp;wchar_t*nextStr;int pos;
tmp=wcsdup(buff);
pos=mystrstr(tmp,txt1);if(pos!=-1){
buff[0]=0;
wcsncpy(buff,tmp,pos);
buff[pos]=0;
wcscat(buff,txt2);
nextStr=tmp+pos+wcslen(txt1);while(wcslen(nextStr)!=0){
pos=mystrstr(nextStr,txt1);if(pos==-1){
wcscat(buff,nextStr);break;}
wcsncat(buff,nextStr,pos);
wcscat(buff,txt2);
nextStr=nextStr+pos+wcslen(txt1);}}
free(tmp);}
Die Funktion repl_str () auf creativeandcritical.net ist schnell und zuverlässig. Auf dieser Seite ist auch eine breite Zeichenfolgenvariante, repl_wcs () , enthalten, die mit Unicode-Zeichenfolgen einschließlich der in UTF-8 codierten Zeichenfolgen über Hilfsfunktionen verwendet werden kann. Der Demo-Code wird von der Seite aus verlinkt. Verspätete vollständige Offenlegung: Ich bin der Autor dieser Seite und der Funktionen darauf.
schnell und zuverlässig, hat aber einen großen Speicherverlust.
MightyPork
3
Ich sehe nicht, wie es könnte. Es gibt nur ein Malloc und der Anrufer wird angewiesen, den Speicher freizugeben, wenn er nicht mehr benötigt wird. Könnten Sie genauer sein?
Laird
@Lairdpos_cache = realloc(pos_cache
PSkocik
@PSkocik Die Funktion wurde seit der Beschwerde von @MightyPork aktualisiert, aber obwohl sie jetzt das zusätzliche Malloc / Realloc für pos_cache enthält, kann ich keinen Codepfad sehen, der das free(pos_cache);Ende der Funktion vermeidet .
Laird
@Laird reallockann fehlschlagen. Wenn dies der Fall ist, wird NULLder alte Zeiger zurückgegeben und bleibt intakt. Wenn dies p = realloc(p, x)fehlschlägt, wird ein gültiger Heap-Zeiger pmit neu geschrieben NULL. Wenn dies pIhr einziger Verweis auf dieses Heap-Objekt war, haben Sie ihn jetzt durchgesickert. Es ist ein klassischer Anfängerfehler.
PSkocik
3
Ich finde die meisten der vorgeschlagenen Funktionen schwer zu verstehen - also habe ich mir Folgendes ausgedacht:
staticchar*dull_replace(constchar*in,constchar*pattern,constchar*by){size_t outsize = strlen(in)+1;// TODO maybe avoid reallocing by counting the non-overlapping occurences of patternchar*res = malloc(outsize);// use this to iterate over the outputsize_t resoffset =0;char*needle;while(needle = strstr(in, pattern)){// copy everything up to the pattern
memcpy(res + resoffset, in, needle - in);
resoffset += needle - in;// skip the pattern in the input-string
in = needle + strlen(pattern);// adjust space for replacement
outsize = outsize - strlen(pattern)+ strlen(by);
res = realloc(res, outsize);// copy the pattern
memcpy(res + resoffset, by, strlen(by));
resoffset += strlen(by);}// copy the remaining input
strcpy(res + resoffset, in);return res;}
Sie können diese Funktion verwenden (die Kommentare erklären, wie es funktioniert):
void strreplace(char*string,constchar*find,constchar*replaceWith){if(strstr(string, replaceWith)!= NULL){char*temporaryString = malloc(strlen(strstr(string, find)+ strlen(find))+1);
strcpy(temporaryString, strstr(string, find)+ strlen(find));//Create a string with what's after the replaced part*strstr(string, find)='\0';//Take away the part to replace and the part after it in the initial string
strcat(string, replaceWith);//Concat the first part of the string with the part to replace with
strcat(string, temporaryString);//Concat the first part of the string with the part after the replaced part
free(temporaryString);//Free the memory to avoid memory leaks}}
Hier ist die, die ich basierend auf diesen Anforderungen erstellt habe:
Ersetzen Sie das Muster, unabhängig davon, ob es lang oder kürzer war.
Verwenden Sie kein Malloc (explizit oder implizit), um Speicherlecks zu vermeiden.
Ersetzen Sie eine beliebige Anzahl von Mustervorkommen.
Tolerieren Sie die Ersetzungszeichenfolge mit einer Teilzeichenfolge, die der Suchzeichenfolge entspricht.
Muss nicht überprüfen, ob das Line-Array ausreichend groß ist, um den Ersatz aufzunehmen. zB Dies funktioniert nur, wenn der Aufrufer weiß, dass die Leitung ausreichend groß ist, um die neue Zeichenfolge aufzunehmen.
/* returns number of strings replaced.
*/int replacestr(char*line,constchar*search,constchar*replace){int count;char*sp;// start of pattern//printf("replacestr(%s, %s, %s)\n", line, search, replace);if((sp = strstr(line, search))== NULL){return(0);}
count =1;int sLen = strlen(search);int rLen = strlen(replace);if(sLen > rLen){// move from right to leftchar*src = sp + sLen;char*dst = sp + rLen;while((*dst =*src)!='\0'){ dst++; src++;}}elseif(sLen < rLen){// move from left to rightint tLen = strlen(sp)- sLen;char*stop = sp + rLen;char*src = sp + sLen + tLen;char*dst = sp + rLen + tLen;while(dst >= stop){*dst =*src; dst--; src--;}}
memcpy(sp, replace, rLen);
count += replacestr(sp + rLen, search, replace);return(count);}
Vorschläge zur Verbesserung dieses Codes werden gerne angenommen. Poste einfach den Kommentar und ich werde ihn testen.
strrep (String Replace). Ersetzt 'strf' durch 'strr' in 'cadena' und gibt den neuen String zurück. Sie müssen die zurückgegebene Zeichenfolge in Ihrem Code freigeben, nachdem Sie strrep verwendet haben.
Parameter cadena Die Zeichenfolge mit dem Text. strf Der zu findende Text. strr Der Ersatztext.
Eine Korrektur der Antwort von fann95 unter Verwendung einer direkten Änderung der Zeichenfolge und der Annahme, dass der Puffer, auf den die Zeile zeigt, groß genug ist, um die resultierende Zeichenfolge aufzunehmen.
ExmapleUsagechar s[]="this is a trial string to test the function.";char x=' ', y='_';
printf("%s\n",zStrrep(s,x,y));ExampleOutput
this_is_a_trial_string_to_test_the_function.
BEARBEITEN: @siride ist richtig, die obige Funktion ersetzt nur Zeichen. Habe gerade diesen geschrieben, der Zeichenketten ersetzt.
#include<stdio.h>#include<stdlib.h>/* replace every occurance of string x with string y */char*zstring_replace_str(char*str,constchar*x,constchar*y){char*tmp_str = str,*tmp_x = x,*dummy_ptr = tmp_x,*tmp_y = y;int len_str=0, len_y=0, len_x=0;/* string length */for(;*tmp_y;++len_y,++tmp_y);for(;*tmp_str;++len_str,++tmp_str);for(;*tmp_x;++len_x,++tmp_x);/* Bounds check */if(len_y >= len_str)return str;/* reset tmp pointers */
tmp_y = y;
tmp_x = x;for(tmp_str = str ;*tmp_str;++tmp_str)if(*tmp_str ==*tmp_x){/* save tmp_str */for(dummy_ptr=tmp_str;*dummy_ptr ==*tmp_x;++tmp_x,++dummy_ptr)if(*(tmp_x+1)=='\0'&&((dummy_ptr-str+len_y)< len_str)){/* Reached end of x, we got something to replace then!
* Copy y only if there is enough room for it
*/for(tmp_y=y;*tmp_y;++tmp_y,++tmp_str)*tmp_str =*tmp_y;}/* reset tmp_x */
tmp_x = x;}return str;}int main(){char s[]="Free software is a matter of liberty, not price.\n""To understand the concept, you should think of 'free' \n""as in 'free speech', not as in 'free beer'";
printf("%s\n\n",s);
printf("%s\n",zstring_replace_str(s,"ree","XYZ"));return0;}
Und unten ist die Ausgabe
Free software is a matter of liberty, not price.To understand the concept, you should think of 'free'
as in 'free speech', not as in 'free beer'
FXYZ software is a matter of liberty, not price.To understand the concept, you should think of 'fXYZ'
as in 'fXYZ speech', not as in 'fXYZ beer'
char* str_replace(char* text,char* rep,char* repw){//text -> to replace in it | rep -> replace | repw -> replace withint replen = strlen(rep),repwlen = strlen(repw),count;//some constant variablesfor(int i=0;i<strlen(text);i++){//search for the first character from rep in textif(text[i]== rep[0]){//if it found it
count =1;//start searching from the next character to avoid repetitionfor(int j=1;j<replen;j++){if(text[i+j]== rep[j]){//see if the next character in text is the same as the next in the rep if not break
count++;}else{break;}}if(count == replen){//if count equals to the lenght of the rep then we found the word that we want to replace in the textif(replen < repwlen){for(int l = strlen(text);l>i;l--){//cuz repwlen greater than replen we need to shift characters to the right to make space for the replacement to fit
text[l+repwlen-replen]= text[l];//shift by repwlen-replen}}if(replen > repwlen){for(int l=i+replen-repwlen;l<strlen(text);l++){//cuz replen greater than repwlen we need to shift the characters to the left
text[l-(replen-repwlen)]= text[l];//shift by replen-repwlen}
text[strlen(text)-(replen-repwlen)]='\0';//get rid of the last unwanted characters}for(int l=0;l<repwlen;l++){//replace rep with repwlen
text[i+l]= repw[l];}if(replen != repwlen){
i+=repwlen-1;//pass to the next character | try text "y" ,rep "y",repw "yy" without this line to understand}}}}return text;}
Wenn Sie möchten, dass strlen-Code den Aufruf von string.h vermeidet
int strlen(char* string){//use this code to avoid calling string.hint lenght =0;while(string[lenght]!='\0'){
lenght++;}return lenght;}
Antworten:
Das Optimierungsprogramm sollte die meisten lokalen Variablen entfernen. Der tmp-Zeiger dient dazu, sicherzustellen, dass strcpy den String nicht durchlaufen muss, um die Null zu finden. tmp zeigt nach jedem Aufruf auf das Ende des Ergebnisses. (Siehe Shlemiel, den Algorithmus des Malers, warum strcpy nervig sein kann.)
quelle
size_t
anstelle vonint
für beliebige Objekt- / Zeichenfolgengrößen und -indizes. Und was ist der Zweckstrcpy(tmp, orig);
am Ende? Es scheint falsch.for
Schleife durch ersetzenfor (count = 1; ins = strstr(ins + rep_len, rep); ++count) {}
und werden danntmp
nur zum Schreiben verwendet.Dies wird in der Standard-C-Bibliothek nicht bereitgestellt, da Sie mit nur einem Zeichen * den der Zeichenfolge zugewiesenen Speicher nicht erhöhen können, wenn die Ersatzzeichenfolge länger als die zu ersetzende Zeichenfolge ist.
Sie können dies einfacher mit std :: string tun, aber selbst dort wird es keine einzelne Funktion für Sie tun.
quelle
Es gibt keinen.
Sie müssten Ihre eigenen mit etwas wie strstr und strcat oder strcpy rollen.
quelle
strcat()
ist ein schlechter Vorschlag.Sie können Ihre eigene Ersetzungsfunktion mit strstr erstellen, um die Teilzeichenfolgen zu finden, und strncpy, um Teile in einen neuen Puffer zu kopieren.
Wenn das, was Sie möchten, nicht
replace_with
die gleiche Länge hat wie das, was Sie möchtenreplace
, ist es wahrscheinlich am besten, einen neuen Puffer zum Kopieren der neuen Zeichenfolge zu verwenden.quelle
Da Zeichenfolgen in C nicht dynamisch wachsen können, funktioniert die Ersetzung an Ort und Stelle im Allgemeinen nicht. Daher müssen Sie Platz für eine neue Zeichenfolge zuweisen, die genügend Platz für Ihre Ersetzung bietet, und dann die Teile aus dem Original sowie die Ersetzung in die neue Zeichenfolge kopieren. Zum Kopieren der Teile würden Sie strncpy verwenden .
quelle
Hier ist ein Beispielcode, der dies tut.
quelle
quelle
Die Funktion repl_str () auf creativeandcritical.net ist schnell und zuverlässig. Auf dieser Seite ist auch eine breite Zeichenfolgenvariante, repl_wcs () , enthalten, die mit Unicode-Zeichenfolgen einschließlich der in UTF-8 codierten Zeichenfolgen über Hilfsfunktionen verwendet werden kann. Der Demo-Code wird von der Seite aus verlinkt. Verspätete vollständige Offenlegung: Ich bin der Autor dieser Seite und der Funktionen darauf.
quelle
pos_cache = realloc(pos_cache
free(pos_cache);
Ende der Funktion vermeidet .realloc
kann fehlschlagen. Wenn dies der Fall ist, wirdNULL
der alte Zeiger zurückgegeben und bleibt intakt. Wenn diesp = realloc(p, x)
fehlschlägt, wird ein gültiger Heap-Zeigerp
mit neu geschriebenNULL
. Wenn diesp
Ihr einziger Verweis auf dieses Heap-Objekt war, haben Sie ihn jetzt durchgesickert. Es ist ein klassischer Anfängerfehler.Ich finde die meisten der vorgeschlagenen Funktionen schwer zu verstehen - also habe ich mir Folgendes ausgedacht:
Ausgabe muss frei sein
quelle
Sie können diese Funktion verwenden (die Kommentare erklären, wie es funktioniert):
quelle
Hier ist die, die ich basierend auf diesen Anforderungen erstellt habe:
Ersetzen Sie das Muster, unabhängig davon, ob es lang oder kürzer war.
Verwenden Sie kein Malloc (explizit oder implizit), um Speicherlecks zu vermeiden.
Ersetzen Sie eine beliebige Anzahl von Mustervorkommen.
Tolerieren Sie die Ersetzungszeichenfolge mit einer Teilzeichenfolge, die der Suchzeichenfolge entspricht.
Muss nicht überprüfen, ob das Line-Array ausreichend groß ist, um den Ersatz aufzunehmen. zB Dies funktioniert nur, wenn der Aufrufer weiß, dass die Leitung ausreichend groß ist, um die neue Zeichenfolge aufzunehmen.
Vorschläge zur Verbesserung dieses Codes werden gerne angenommen. Poste einfach den Kommentar und ich werde ihn testen.
quelle
Sie können strrep () verwenden
char * strrep (const char * cadena, const char * strf, const char * strr)
strrep (String Replace). Ersetzt 'strf' durch 'strr' in 'cadena' und gibt den neuen String zurück. Sie müssen die zurückgegebene Zeichenfolge in Ihrem Code freigeben, nachdem Sie strrep verwendet haben.
Parameter cadena Die Zeichenfolge mit dem Text. strf Der zu findende Text. strr Der Ersatztext.
Rückgabe Der mit dem Ersatz aktualisierte Text.
Das Projekt finden Sie unter https://github.com/ipserc/strrep
quelle
Eine Korrektur der Antwort von fann95 unter Verwendung einer direkten Änderung der Zeichenfolge und der Annahme, dass der Puffer, auf den die Zeile zeigt, groß genug ist, um die resultierende Zeichenfolge aufzunehmen.
quelle
Dort gehen Sie .... das ist die Funktion jedes Vorkommen von ersetzen
char x
mitchar y
innerhalb Zeichenkettestr
Ein Beispiel für eine Verwendung könnte sein
Die Funktion stammt aus einer String-Bibliothek, die ich auf Github verwalte . Sie können sich gerne andere verfügbare Funktionen ansehen oder sogar zum Code beitragen :)
https://github.com/fnoyanisi/zString
BEARBEITEN: @siride ist richtig, die obige Funktion ersetzt nur Zeichen. Habe gerade diesen geschrieben, der Zeichenketten ersetzt.
Und unten ist die Ausgabe
quelle
quelle
quelle
quelle
Diese Funktion funktioniert nur, wenn Ihr String zusätzlichen Platz für neue Länge hat
Dies ersetzt nur das erste Auftreten
quelle
Hier ist meins, es ist in sich geschlossen und vielseitig sowie effizient, es wächst oder schrumpft Puffer nach Bedarf in jeder Rekursion
quelle
Hier geht meins, mach sie alle char *, was das Anrufen erleichtert ...
quelle
Verwenden Sie nur strlen aus string.h
Entschuldigung für mein Englisch
Wenn Sie möchten, dass strlen-Code den Aufruf von string.h vermeidet
quelle