Problem mit Pfadangaben - Leerzeichen

Oh man ist das eine schwere Geburt:
Naja, schau mal hier:
C:
  const char delim = ':';

  for (char* start, *end = strchr(p, delim); start = end; ) {
    if (end = strchr(start + 1, delim)) {
      printf("%.*s\n", end - start, start - 1);
    } else {
      puts(start - 1);
    }
  }

Jetzt scheitert es an der strncpy funktion:

"E2034 Konvertierung von 'int' nach 'const char *' nicht möglich" - temp und temp2 sind ja zeiger wenn ich das richtig verstehe - aber scheinbar wird etwas anderes erwartet...wie wandel ich die zeiger um und was wird überhaupt erwartet ?
Das kannst du ganz schnell mit Google rausfinden. :google:

Du mußt übrigens für temp3 noch Speicher anfordern.

Gruß
 
Zuletzt bearbeitet:
Ersteinmal Danke für deine Hilfe und deine Geduld ! :)

Allerdings raff ich es immer noch nicht so richtig...mit der printf - Methode bekomme ich zwar auch die einzelnen Pfäde auf der Kommandozeile ausgegeben, aber wie kann ich die den jetzt in einer Variablen speichern ?

Ich treff immer auf diesen Fehler:
[C++ Fehler] E2034 Konvertierung von 'int' nach 'char *' nicht möglich
 
Allerdings raff ich es immer noch nicht so richtig...mit der printf - Methode bekomme ich zwar auch die einzelnen Pfäde auf der Kommandozeile ausgegeben, aber wie kann ich die den jetzt in einer Variablen speichern ?

Ich treff immer auf diesen Fehler:
[C++ Fehler] E2034 Konvertierung von 'int' nach 'char *' nicht möglich
Hast du dir denn mal die Dokumentation der strncpy Funktion angeschaut? Siehe z.B. http://www.cplusplus.com/reference/clibrary/cstring/strncpy.html

Da steht genau da was die Funktion erwartet und es gibt sogar ein Beispiel.

Du mußt doch nur das Ziel (wo genügend Speicherplatz zur Verfügung steht) angeben, die Quelle und die Anzahl der Zeichen die kopiert werden sollen. Dann muß man den String noch terminieren.

Gruß
 
Ja hab die Hilfe vom Borland Builder benutzt - mir ist das glaube ich auch klar - nur weiß ich nicht wie ich es umsetzen kann...

Code:
char pfad[2];
int x = 0;

fgets(paths, maxSize, datei);

const char delim = ':';
for (char* start, *end = strchr(paths, delim); start = end; ) {
        if (end = strchr(start + 1, delim)) {
            printf("%.*s\n", end - start, start - 1);
            strncpy (pfad[x], ?, ?);
            cout << "pfad: " << test << endl;
            x++;
        }
        else {
            puts(start - 1);
        }
}

- das 1. Argument ist ein Array in der das Ergebnis gespeichert wird
- das 2. Argument ist der String...Jetzt ist aber mein Problem das ich hier nur die 2 Zeiger hab, die auf den Anfang und auf das Ende zeigt...aber wie bekomme ich da nen String raus ?
- das 3. Argument ist dann die Länge - ein integer denke ich mal...

das 2. Argument ist sicherlich - das Problem denke ich mal
 
Ja hab die Hilfe vom Borland Builder benutzt - mir ist das glaube ich auch klar - nur weiß ich nicht wie ich es umsetzen kann...

Code:
char pfad[2];
int x = 0;

fgets(paths, maxSize, datei);

const char delim = ':';
for (char* start, *end = strchr(paths, delim); start = end; ) {
        if (end = strchr(start + 1, delim)) {
            printf("%.*s\n", end - start, start - 1);
            strncpy (pfad[x], ?, ?);
            cout << "pfad: " << test << endl;
            x++;
        }
        else {
            puts(start - 1);
        }
}

- das 1. Argument ist ein Array in der das Ergebnis gespeichert wird
- das 2. Argument ist der String...Jetzt ist aber mein Problem das ich hier nur die 2 Zeiger hab, die auf den Anfang und auf das Ende zeigt...aber wie bekomme ich da nen String raus ?
- das 3. Argument ist dann die Länge - ein integer denke ich mal...

das 2. Argument ist sicherlich - das Problem denke ich mal
Nee, da gibt es eigentlich kein Problem, denk ich mal. ;-)

Zuerst hast du jetzt ein Array namens pfad definiert wo du genau 2 Zeichen drin speichern kannst. Dadurch, dass ein C-String immer mit einem \0 Zeichen terminiert werden muss, könntest du folglich max. einen String von 1 Zeichen darin speichern. Was etwas zu wenig sein dürfte.

Das zweite Argument ist der String, das ist richtig. Genau der wurde doch in der Schleife berechnet. Genau wie der String auch der puts bzw. printf Funktion übergeben wird, muss er natürlich auch der strncpy Funktion übergeben werden.

C:
char pfad[10][80]; /* 10 Pfade mit max. 79 Zeichen. */
int count = 0;

fgets(paths, maxSize, datei);

const char delim = ':';
for (char* start, *end = strchr(paths, delim); c < 10 && start = end; ++count) {
        if (end = strchr(start + 1, delim)) {
            printf("%.*s\n", end - start, start - 1);
            strncpy (pfad[count], start - 1, end - start);
        }
        else {
            puts(start - 1);
            strcpy(pfad[count], start - 1);
        }
        cout << pfad[count] << endl;
}
Gruß
 
Zuletzt bearbeitet:
Ersteinmal nochmal vielen Dank für deine Hilfe Normalerweise geb i meinen Kumpels ein Bierchen aus oder so wenn sie mir helfen...Also wenn du mal in Sachsen bist ;-)


Jetzt hab ich mal noch eine Fragen - ich will aber nicht immer einen neuen thread aufmachen - darum schreib ichs hierein...

Bisher wurden die Pfadangaben immer so geholt:
C++:
char Pfad1[W_STRING_SIZE],Pfad2[W_STRING_SIZE],Pfad3[W_STRING_SIZE]="";

sscanf(Arg,"%*s %s %s %s %d",Pfad1,Pfad2,Pfad3,&Nr)

da gabs ja das Problem mit dem Leerzeichen und der Übergabe...nun hab ich die Pfade ja auf andere Art herbekommen....

Jetzt scheitert es aber an der Übergabe an die OriginalVariablen..denn so wie ich mir das dachte funktioniert es leider nicht...
C++:
Pfad1[W_STRING_SIZE] = *pfad[0];
Pfad2[W_STRING_SIZE] = *pfad[1];
Pfad3[W_STRING_SIZE] = *pfad[2];
 
Hi.
Ersteinmal nochmal vielen Dank für deine Hilfe Normalerweise geb i meinen Kumpels ein Bierchen aus oder so wenn sie mir helfen...Also wenn du mal in Sachsen bist ;-)
Ich war am Wochenende erst in Leipzig - also kann schon sein... ;)

C++:
char Pfad1[W_STRING_SIZE],Pfad2[W_STRING_SIZE],Pfad3[W_STRING_SIZE]="";

Pfad1[W_STRING_SIZE] = *pfad[0];
Pfad2[W_STRING_SIZE] = *pfad[1];
Pfad3[W_STRING_SIZE] = *pfad[2];
Stellt sich erstmal die Frage, warum die es jetzt wieder an einzelne Variablen zuweisen willst, wo du doch alles schon geordnet in einem Array hast. Aber gut.

So wie du die Variablen Pfad1 usw. deklariert hast, sind diese char-Arrays von W_STRING_SIZE Zeichen.

Wenn du auf Pfad[W_STRING_SIZE] zugreifst, greifst du auf ein einzelnes Zeichen - also ein char zu (welches nicht existiert, da der gültige Index-Bereich von 0 bis (W_STRING_SIZE - 1) geht).

pfad ist ein 2-dimensionales char-Array. Wenn du schreibst "*pfad[0]", ist das das Gleiche wie "pfad[0][0]" und damit greifst du auch wieder auf ein einzelnes Zeichen zu.

Du hast also erfolgreich das erste Zeichen von pfad[0] dem Zeichen hinter dem letzten gültigen Zeichen von Pfad1 zugewiesen.

Arrays kann man in C nicht einfach so zuweisen. Du mußt dann schon die strcpy Funktion verwenden.

Oder du verwendest Zeiger:
C:
char* Pfad1 = pfad[0];
Ob das aber einfach/besser ist als direkt das Array zu verwenden...

Gruß
 
Okay wieder was gelernt - glaub ich - Vielen Dank


Hi.Ich war am Wochenende erst in Leipzig - also kann schon sein... ;)

Dann sagst du das nächste Mal Bescheid! :)


Stellt sich erstmal die Frage, warum die es jetzt wieder an einzelne Variablen zuweisen willst, wo du doch alles schon geordnet in einem Array hast. Aber gut.

Theoretisch Hast du ja Recht - und da bin ich mir dir auch einer Meinung!


Jetzt funktioniert es ja fast, allerdings sind manchmal an den Pfaden...undefinierbare Zeichen angehangen wie z.B hier:

d:\temp\01\01.txt¯?¯?

was im weiteren Verlauf zu Problemen führt...

Wodurch kommt das zustande und wie verhindere ich sowas ?
 
Jetzt funktioniert es ja fast, allerdings sind manchmal an den Pfaden...undefinierbare Zeichen angehangen wie z.B hier:

d:\temp\01\01.txt¯?¯?

was im weiteren Verlauf zu Problemen führt...

Wodurch kommt das zustande und wie verhindere ich sowas ?
Man muss den String nach dem Kopieren mit strncpy noch ordentlich terminieren:
C:
strncpy(pfad[count], start - 1, end - start);
pfad[count][end - start] = '\0';
Gruß
 
Erst einmal vielen Dank für deine Hilfe - soweit läuft jetzt alles...

aber i muss sagen als Neuling ist es schwierig gerade mit den Variablen, Zeigern usw...zurecht zu kommen
 
Zurück