2017-06-01 4 views
3

J'ai un problème étrange avec la fonction realpath. La fonction fonctionne quand on lui donne une chaîne reçue comme argument pour le programme, mais échoue quand on lui donne une chaîne que je définis dans le code source. Voici un programme simple:La fonction C realpath ne fonctionne pas pour les chaînes définies dans le fichier source

#include <stdlib.h> 
#include <limits.h> 
#include <stdio.h> 

int main(int argc, const char* argv[]) 
{ 
    char* fullpath = (char*)malloc(PATH_MAX); 
    if(realpath(argv[1], fullpath) == NULL) 
    { 
     printf("Failed\n"); 
    } 
    else 
    { 
     printf("%s\n", fullpath); 
    } 
} 

Quand je lance cela avec un argument (file existe et est un fichier normal) je reçois le résultat attendu

/home/<username>/Desktop/file 

Voici une autre version du programme:

#include <stdlib.h> 
#include <limits.h> 
#include <stdio.h> 

int main(int argc, const char* argv[]) 
{ 

    const char* path = "~/Desktop/file"; 

    char* fullpath = (char*)malloc(PATH_MAX); 
    if(realpath(path, fullpath) == NULL) 
    { 
     printf("Failed\n"); 
    } 
    else 
    { 
     printf("%s\n", fullpath); 
    } 
} 

Quand je lance ce programme je reçois la sortie

Failed 

Pourquoi le second échoue-t-il?

+1

Sans rapport avec votre question, mais pourquoi allouez-vous 'fullpath' dynamiquement? Pourquoi pas un tableau? –

+0

En ce qui concerne votre problème, avez-vous essayé d'imprimer 'argv [1]' pour voir ce que c'est? Et vérifier 'errno' quand l'appel échoue? Je vous suggère également de lire [la page de manuel 'realpath'] (http://man7.org/linux/man-pages/man3/realpath.3.html). –

Répondre

6
const char* path = "~/Desktop/file"; 

le caractère tilde (i.e. .: ~) n'est pas étendu (e.i .: remplacé par le chemin de votre répertoire ) dans votre programme. Lorsque vous le spécifiez comme argument dans la ligne de commande comme dans votre premier programme, il est développé par le shell.

1

Le shell étend le ~ au nom correct avant d'exécuter le programme et c'est ce qui est dans argv [1].

En cas de codage en dur, le nom n'est pas automatiquement développé pour vous.