Fehler beim zeichenweise kopieren über char *

hallo,
ich versuche mir die funktion splitpath zu implementieren
ich habe einen fertigen code und muss ihn anpassen damit es für pfade in linux funktioniert.

main()
{

char * path = „home/man/dir1/IMAGE/hello/image.jpg“; // dateiname als bsp zum testen
//char *split_drive, *split_dir, *split_filename, *split_extension;
char split_drive[5], split_dir[260], split_filename[100], split_extension[10];

//aufruf der funktion
splitpath(path,split_drive,split_dir,split_filename,split_extension);


}

void splitpath(char *path, char *split_drive, char *split_dir, char *split_filename, char
*split_extension)
{
const char* end; /* end of processed string */
const char* p; /* search pointer */
const char* s; /* copy pointer */
int i=0;

/* extract drive name */
if (path[0] && path[1]==’:’) {
if (split_drive) {
*split_drive++ = *path++;
*split_drive++ = *path++;
*split_drive = ‚\0‘;
}
} else if (split_drive)
*split_drive = ‚\0‘;

/* search for end of string or stream separator */
//for(end=path; *end && *end!=’:’; )
for(end=path; *end; )
{
end++;
i++;
}

printf(„path length gerechnet: %d\n“,i);
printf(„path aus strlen: %d\n“,strlen(path));

/* search for begin of file extension */

//for(p=end; p>path && *–p!=’\’ && *p!=’/’; )
for(p=end; p>path && *–p!=’/’ && *p!=’/’; )
{
//printf(„ext i: %c\n“,*p);
if (*p == ‚.‘) {
end = p;
break;
}
}

if (split_extension)
/*for(s=end; (*split_extension=*s++); )
{

split_extension++;
printf(„ext i: %c\n“,*split_extension);
}*/

for(s=end; *s; )
{
*split_extension=*s; /**********FEHLER****************/
s++;
split_extension++;
printf(„s : %c\n“,*s);//j p g
printf(„split_extension : %c\n“,*split_extension);
}

fehler:der inhalt von s stimmt aber wird nicht copiert nach split_extension
kann mir jemand erklären warum ?

youssef

Hallo,

Dein Listing ist mir zu unübersichtlich und ich habe gerade wenig Zeit. Nutze doch bitte das „pre“ tag für Listings, dann bleibt die Formatierung erhalten.

Für Din Problem gibt es übrigens fertige Funktionen (zumindest in der glibc, der standard C-Bibliothek für den GNU C Compiler).

Schau mal unter „Pattern Matching“ und „Globbing“ in der Anleitung:

http://www.gnu.org/software/libc/manual/html_mono/li…

Gruß

Fritze

hallo,
ich versuche mir die funktion splitpath zu implementieren
ich habe einen fertigen code und muss ihn anpassen damit es
für pfade in linux funktioniert.

[…]

 if (split\_extension)
 /\*for(s=end; (\*split\_extension=\*s++); )
 {
 split\_extension++;
 printf("ext i: %c\n",\*split\_extension);
 }\*/

!!! HIER FEHLT EIN SEMIKOLON !!!

 for(s=end; \*s; )
 {
 \*split\_extension=\*s; /\*\*\*\*\*\*\*\*\*\*FEHLER\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
 s++;
 split\_extension++;
 printf("s : %c\n",\*s);//j p g
 printf("split\_extension : %c\n",\*split\_extension);
 }

fehler:der inhalt von s stimmt aber wird nicht copiert nach
split_extension
kann mir jemand erklären warum ?

Durch dein auskommentieren sieht der Compiler folgenden Code

 if (...)
 for( ... )
 {}

Gruß Markus

 if (...)
 for( ... )
 {}

Was ist daran falsch?
Da das Programm laeuft, kann es sich ja nur um einen
Logikfehler handeln.

Gruss, Patrick

if (…)
for( … )
{}

Was ist daran falsch?
Da das Programm laeuft, kann es sich ja nur um einen
Logikfehler handeln.

Falsch ist, das if() sich ursprünglich auf einen anderen Code-Block bezieht, der nun mittels /*…*/ auskommentiert ist. Ich habe das im original Code mit !!! versehen. Schau es dir mal an, dann weisst du , was ich meine.

Gruß Markus

Falsch ist, das if() sich ursprünglich auf einen anderen
Code-Block bezieht, der nun mittels /*…*/ auskommentiert
ist. Ich habe das im original Code mit !!! versehen. Schau es
dir mal an, dann weisst du , was ich meine.

Das Semikolon damit das if sozusagen neutralisiert wird!?
(Schoen waeren da auch ein paar geschweifte Klammern)

Das wuerde dann Sinn machen, wenn sich das if jetzt nicht
auf die 2. for-Schleife beziehen soll.

Das ist meine Vermutung, aber rein spekulativ. Vielleicht ist
die 1. schleife sozusagen der 1. Versuch??

Gruss, Patrick

Hallo zusammen!

Nicht dass das so neu wäre, aber ich muss es wieder mal loswerden:

Das Semikolon damit das if sozusagen neutralisiert wird!?
(Schoen waeren da auch ein paar geschweifte Klammern)

Yepp! Grundsätzlich achte ich darauf Anweisungen nach if, for, while etc. IMMER in geschwungene Klammern zu setzen. Das sieht zwar vielleicht nicht ganz so elegant aus, erspart einem aber langwieriege Fehlersuche bei nachträglichen Änderungen.

Beispiel gefällig?

Der ursprüngliche Code:

a = do\_something(x, y); // gibt im Fehlerfall -1 zurück
if (-1 == a)
 exit(1);

Später gefällt es mir nicht mehr, dass das Programm sich bei einem Fehler sang- und klanglos verabschiedet, also folgende Änderung:

a = do\_something(x, y); // gibt im Fehlerfall -1 zurück
if (-1 == a)
 printf("Falsche Parameter (%ld,%ld)\n", x, y);
 exit(1);

Blöderweise kann meine Funktion jetzt offenbar mit keinerlei Parametern mehr ausgeführt werden. Das wird man im Beispiel recht schnell feststellen, aber wehe dem Programmierer, wenn er sich einen Abbruch erwartet (z.B. ein Check auf char* == NULL) der dann nicht stattfindet. Gibt beim Dereferenzieren des Pointers wunderschöne Exceptions, die immer so leicht zu finden sind.

So wär’ das nicht passiert:

a = do\_something(x, y); // gibt im Fehlerfall -1 zurück
if (-1 == a)
 {
 exit(1);
 }

Gruß vom oberg’scheiten Martin

1 Like