Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » escape path

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.09.2005, 00:40 Uhr
Pablo
Supertux
(Operator)


Hallo

ich schrein ein kleines Programm, dass Verzeichnis mit Bildern scannt und fügt sie in eine temporere DB hinzu, dann wählt eins zufällig aus und führt ein externes Programm, das das ausgwählte Bild als Argument enthält.

Nun, das Problem ist, dass so ein Bild /home/supertux/back/bild one.jpg zwar richtig erkannt wird, aber wenn ich so übergebe, dann findet das externe Programm das Bild nicht, wegen dem Leerzeichen. Deswegen wollte ich eine Funktion schreiben, die mir diesen Pfad die Leerzeichen escpat. Ich hab folgendes:


C++:
int countblankspaces(const char* source)
{
        int count=0, i,len;
        if(!source) return -1;

        len = strlen(source);

        for(i=0; i<len; ++i)
                if(source[i] == ' ')
                        ++count;

        return count;
}

char* escapepath(const char* path)
{
        char* tmp, *blank, *tmp2;
        int len, newlen, bscount, i;
                        
        if(!path)      
                return NULL;
                        
        len = strlen(path);
        bscount = countblankspaces(path);
                
        if(bscount==-1) return NULL;
                
        if(!bscount)
                return strdup(path);

        newlen = len + bscount;
                
        tmp = malloc(newlen);
                        
        if(!tmp)
                return NULL;
                
        *tmp = 0;
        tmp2 = tmp;
                        
        for(i=0; i<bscount; ++i)
        {
                blank = strstr(path, " ");
                memmove(tmp2, path, blank - path);
                tmp2[blank - path] = 0;
                strcat(tmp, "\\ ");
                tmp2 += (blank - path) + 2;
                path = blank + 1;
        }
                
        strcpy(tmp2, path);

        return tmp;
}



aber ich nicht sicher, ob der Code auch gut ist. Habt ihr Verbesserungsmöglichkeiten?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.09.2005, 01:23 Uhr
imhotep
followed the white rabbit


was auffällt, das du den ganzen String 2 mal in einer Schleife durchläufst, einmal um die Leerzeichen zufinden und einmal um sie zu ersetzen. Würde das ganze in einer Schleife machen. Hab da mal eine von meine, in der ich Leezeichen in "%20" für URL umwandle.


C++:
  char hilf[1024] = "\0", zielordner[1024], urlzielordner[1024] = "\0";

/* ....... */

  count = 0;
  for (i = 0; i < strlen(zielordner); i++){
    if (zielordner[i] == ' ') {
      hilf[(count*2) + i] = '%';
      hilf[(count*2) + i + 1] = '2';
      hilf[(count*2) + i + 2] = '0';
      count ++;
    } else hilf[(count*2) + i] = zielordner[i];
  }
  hilf[(count*2) + i] = '\0';
  strcat(urlzielordner, hilf);


Du könnstes auch path als Referenz übergeben.

Dieser Post wurde am 04.09.2005 um 01:30 Uhr von imhotep editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.09.2005, 08:29 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich finde Die Routinen, welche ein spezielles Zeichen ersetzen, in der Regel recht fragwürdig: denn morgend willst Du vielleicht noch ein weiteres Zeichen zusätzlich escapen, da wäre es also vielleicht schon besser Die zu escapenden Zeichen selbst als String zu übergeben...

Aber setbst wenn man sich drauf einigt, daß die Routine nur Leerzeichen escapen soll, finde ich sie vom Interface eher unhandlich: sie zwingt den Anwender dazu, die von dir vorgeschriebene dynamische Speicherverwaltung mitzumachen, denn sonst wird es hochgradig ineffizient:

C++:
char orgpath[PATH_MAX];
char escpath[2*PATH_MAX];
...
char* ptr = escapepath(orgpath);
strcpy(escpath, ptr);
free(ptr);


Ich würde es halt so machen:

C++:
char* escapepath(const char* in, char* out, size_t out_len) {
     size_t i = 0;
     size_t o = 0;
     while(in[i] && o<out_len-1) {
          if (in[i]==' ') {
             out[o++] = '\\';
          }
          out[o++] = in[i++];
     }
     if (o<out_len) out[o] = o;
     return in[i]? NULL: out;
}


Da kann sich der Anwender selbst überlegen, ob ers es nun gerne dynamisch hat, entweder indem er einen eigenen Wrapper schreibt oder indem er einfach weiß, daß der Escapte String max. doppelt so lang sein kann, wie der Originalstring.

Speziell bei deinem Problem würde ich mir die Arbeit überhaupt nicht machen, denn das externe Programm wirst Du ja mit einem Call wie execl, popen, systen o.ä. Ausführen: wenn Du da den Pfad in Quotes setzt (popen bzw. system) bzw. als eigenständiges Argument übergibst (execl) hast Du doch eh kein Brassel damit.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.09.2005, 12:57 Uhr
Pablo
Supertux
(Operator)


Danke Virtual, das ist echt eine bessere Routine. Wie imhotep sagte, mir ist aufgefallen, dass ich das string 2 Mal durchlaufe und das wäre ja unnötigt. Ich werde es so versuchen, wie du es gemacht hast, das finde ich klüger.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: