Neuankömmling sucht Hilfe (wie üblich)
-
Danke euch für euer Hilfe, hab Heute wieder ein bisschen angefangen.
Wollte fragen ob mir jemand per ICQ oder MSN ab und zu eine kleine Frage beantworten könnte, damit ich weiterkomme.
So ähnlich wie diese
Von VB her kenne ich die Mid() Funktion.
Also Mid(string, anfang, länge)
Habe lange im Internet gefunden und ein selbstgeschriebenes C Deriverat gefunden, naja es funktioniert nicht, vielleicht hat jemand ein besseres oder findet die Fehler in dieser Funktion, danke!
char *mid(char *dest, const char *src, int start, int len = -1) { if (len == -1) len = strlen(src) - start; strncpy(dest, src+start, len); *(dest+ (len-start)) = 0; return dest; }
Bin schon ein bisschen weiter, naja der Funktionsweise noch nicht ganz bewusst
char* mid(const char* src, int start, int len) { char* s_return; len = strlen(src) - start; strncpy(s_return, src+start, len); *(s_return+ (len-start)) = 0; return s_return; }
Gruss Peter
-
SplifStar_SS schrieb:
Bin schon ein bisschen weiter, naja der Funktionsweise noch nicht ganz bewusst
char* mid(const char* src, int start, int len) { char* s_return; //wie DIM (so hieß es doch oder?) in VB is das - variablendeklaration len = strlen(src) - start; //strlen = stringlänge strncpy(s_return, src+start, len); //strncpy -> man strncpy *(s_return+ (len-start)) = 0; //versteh ich das richtig? das letzte //char vom teilstring auf 0 setzen... wobei das eigentlich lt. //man > strncpy machen sollte... return s_return; //zurückgeben }
sieht nach einer art "substr()" funktion aus (dh: teilstring [von, länge]) zurückliefern.
was ist dir sonst noch nicht klar? (hab jetzt keine ansi C comments gemacht!)hth,
ciao
-
Danke für deine Antwort, ja in PHP bekannt als substr(); in VB Mid().
Dim, genau, oder in JS var
Wollte nur ein Script von mir nachbauen um zu üben, dazu fehlte mir aber die Mid() Funktion, hab diese Funktion nicht selber geschrieben, ist eine im Web "gefundene", funktioniert aber nicht so ganz wie sie soll.
Es kommen keine Fehler mehr aber die Ausgabe sind reine Zahlen..?
Hier ein Beispiel:
#include <stdio.h> #include <stdlib.h> #include <string.h> char* mid(const char* src, int start, int len) { char* s_return; //wie DIM (so hieß es doch oder?) in VB is das - variablendeklaration len = strlen(src) - start; //strlen = stringlänge strncpy(s_return, src+start, len); //strncpy -> man strncpy *(s_return+ (len-start)) = 0; //versteh ich das richtig? das letzte //char vom teilstring auf 0 setzen... wobei das eigentlich lt. //man > strncpy machen sollte... return s_return; //zurückgeben } int main(int argc, char *argv[]) { printf("%d", mid("Irgendein Text", 2, 5)); system("PAUSE"); return 0; }
-
try
printf("%s", mid("Irgendein Text", 2, 5));
%d is für ints.
hth
-
Jo nimm %s. Und dass das Teil nicht segfaultet ist eh ein Wunder. Du hast für "s_return" überhaupt keinen Speicher reserviert.
Und warum du den Parameter "len" übergibst ohne ihn irgendwie auszuwerten bevor du ihn überschreibst verstehe ich auch nicht ganz...
-
Hi Tactx, tut mir leid, ich bin Anfänger, verstehe also noch nicht viel von der "C" Materie, viellecht könntest du mir die Sachen erklären?
Die Funktion hab ich nicht selber geschrieben, sondern gefunden, dieses Beispiel sollte als Ergebniss Haus liefern, damit sie äqualent zu VBScript`s Funktion Mid() arbeitet.
Was müsste ich hier ändern?
#include <stdio.h> #include <stdlib.h> #include <string.h> char* mid(const char* src, int i_start, int i_laenge) { char* s_return; i_laenge = strlen(src) - i_start; strncpy(s_return, src+i_start, i_laenge); *(s_return+ (i_laenge-i_start)) = 0; return s_return; } int main(int argc, char *argv[]) { printf("%s", mid("EinHausistHier", 4, 4)); system("PAUSE"); return 0; }
-
SplifStar_SS schrieb:
char* s_return = (char *)malloc(sizeof(char)*XXX);
wobei man natürlich die rückgabe von malloc prüfen sollte und XXX musst du durch die länge des neuen string ersetzen...
hth,
ciao
-
hephaistos6 schrieb:
SplifStar_SS schrieb:
char* s_return = (char *)malloc(sizeof(char)*XXX);
wobei man natürlich die rückgabe von malloc prüfen sollte und XXX musst du durch die länge des neuen string ersetzen...
hth,
ciaoHallo, nehme an malloc() = Memory Alloc?
Was muss ich für XXX einsetzen?
Grösse des Strings?Verstehe noch nicht ganz
-
Entweder mit malloc() oder du übergibst der Funktion einen Buffer wo sie das Ergebnis reinschreiben soll:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define BUFFSIZE 20 // Nur für AJ ;) char buffer[BUFFSIZE]; int mid(const char* src, char* buff, int buffsize, int i_start, int i_laenge) { memset(buff,0,buffsize); // Buffer nullen, dann sparen wir uns auch die terminierende Null if(i_laenge >= buffsize) return 0; // Ergebnisstring waere groesser als Buffer else if( (i_start+i_laenge) > strlen(src)) return 0; // Wir wollen auch unseren src-String nicht verlassen else { memcpy(buff,src+i_start, i_laenge); // hier kopieren wir den eigentlichen String return 1; } } int main(int argc, char *argv[]) { if(mid("EinHausistHier",buffer, BUFFSIZE, 4, 10)) printf("Text: %s\n", buffer); else printf("Fehler ist aufgetreten\n"); return 0; }
Auf die schnelle würde ich das so machen...
-
Hi tactX, also jetzt kommt es mir noch spanischer vor und die Funktion liefert nicht den Teilstring denn sie sollte.
Also ab dem vierten Zeichen, vier Zeichen.
-
Er fängt auch beim 4. Buchstaben an. In C werden Strings (allg. Arrays) immer beginnen mit 0 angesprochen. Also ist das 0. Element eines Strings der 1. Buchstabe. Sicher könnte man die Funktion dahingehend abändern, da das aber C-untypisch wäre halte ich das für keine gute Idee.
Was genau verstehst du an der Funktion nicht?
-
ah okay, das mit dem index von 0 an kenn ich von den vbscript arrays,
werde mich jetzt an was anderes widmen.Vielen Dank nochmal für die Hilfe!