PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeichenkettenverarbeitung in C


Harleckin
2004-02-11, 12:30:28
helft mir mal schnell in "C" auf die Sprünge.. ich will einen simplen string (argv[1]) _zeichenweise_ in ein array[] packen um ihn später weiterzuverarbeiten.
Bisherige versuche mit fgets(), gets() und fgetc() scheiterten komplett.

Der Funktionsname zur Lösung des Problemes würde mir schon einiges weiterhelfen.

Metzler
2004-02-11, 13:49:22
Du willst also einen char *t in ein anderes Char-Array kopieren, versteh ich dich da richtig?
Wie wärs mit strcpy?

Harleckin
2004-02-11, 14:24:02
Nicht wirklich.. gegeben ist foo vom Typ char und dem Inhalt "bar".
Ok diese Zeichenkette soll in ein Array, d.h. jedes Zeichen in ein eigenes Feld.

---------
|0|1|2|4|
---------
|b|a|r|\0|
---------

Metzler
2004-02-11, 14:29:05
Wie wärs mit einer einfachen Schleife?
Und den Index kannst du ja an das andere Array anpassen, wo halt der Inhalt von foo hin soll...

char *foo = (char *)malloc(4);
strcpy(foo, "bar");
for (int i = 0; i <= strlen(foo); i++)
{
cout << foo[i];
}

Crushinator
2004-02-11, 14:52:37
ein char mit dem Inhalt "bar" ist doch bereits ein char array weil es aus 4 chars besteht.

for (int ui = 0; ui<=strlen(argv[1]); ui++)
{
printf("%c\n", argv[1][ui]);
}

Deshalb kann man den Inhalt auch gleich (siehe Metzlers Beispiel) mit strcpy in einen neuen char array - im Volksmund auch String genannt - kopieren. ;)

Harleckin
2004-02-11, 15:44:33
Ok, ihr habt mir schon sehr viel weiter geholfen.. wenn ich es schaff, poste ich morgen die restlichen Codezeilen von dem Mini-C-Prog.

Exxtreme
2004-02-11, 16:22:22
Also um C-Strings zu kopieren verwendet man normalerweise strcpy ... oder besser noch strncpy. Mit strncpy kann man eventuelle Bufferoverflows vermeiden. Man muss halt zusätzlich als Parameter die Ziel-Stringlänge übergeben.

Lokadamus
2004-02-11, 18:48:02
mmm...

Und die Zeichenkettenlänge bekommt man mit strlen raus, wenn ich mich nicht irre ...

Harleckin
2004-02-12, 13:46:49
/* hantorihanzo.c */
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv) {

if (argc == 2) {
//char *filename;
//filename = (char *)calloc(strlen(strrchr(argv[1], '/')-1) + strlen(strrchr(argv[1], '/')), sizeof(char));

char *str1 = strrchr(argv[1], '/');
char *str2 = &str1[1];

//strcat(filename, str2);
if (fork() == 0) {
execl("/usr/bin/curl","curl","-x","http://PROXY:PORT",argv[1],"-o",str2,0);
perror("curl");
}
} else {
printf("usage:\t%s URL\n",argv[0]);
}

//free(filename);
return(0);
}

Also mal kurz zum Sinn des Programmes..
Bsp:
'./hantorihanzo http://foobar.com/foo/bar.file'

execl() ruft 'curl'[1] auf und übergibt den Proxy, die URL (argv[1]) und den Dateinamen (str2).
Der Dateiname wird aus der URL genommen, was ich mittels strrchr() mache. Daraufhin bekommen ich "/bar.file" zurückgeliefert.
Nun muss aber noch der führende Slash entfernt werden, was ich durch das Umbiegen des Zeigers *str2 auf die Adresse des zweiten Feldes (argv[1][1]) mache.

Ich hoffe mal es konnte jeder meinen Ausführungen folgen.. die Methode mit strcat() hab ich mal komplett auskommentiert, da dies überflüssig ist.

[1] http://curl.haxx.se/