2017-06-01 3 views
3

realpath関数で奇妙な問題が発生しました。この関数は、プログラムの引数として受け取った文字列が与えられたときに機能しますが、ソースコードで定義した文字列が与えられたときに失敗します。ここでは単純なプログラムです:ソースファイルに定義されている文字列のC realpath関数が機能しません

#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); 
    } 
} 

私は(fileは、通常のファイルを存在している)引数でこれを実行すると、私が期待される出力に

/home/<username>/Desktop/file 

を取得ここで、プログラムの別のバージョンは以下のとおりです。

#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); 
    } 
} 

私はこのプログラムを実行すると、私は、出力

を取得10
Failed 

なぜ2番目のエラーは失敗しますか?

+1

あなたの質問とは無関係ですが、なぜ 'fullpath'を動的に割り当てるのですか?なぜ配列ではないのですか? –

+0

あなたの問題については、それが何であるかを見るために 'argv [1]'を印刷してみましたか?呼び出しが失敗したときに 'errno'をチェックしますか?また、[realpathのマニュアルページ](http://man7.org/linux/man-pages/man3/realpath.3.html)を読むことをお勧めします。 –

答えて

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

チルダ文字(すなわち:~はあなたのプログラムに(e.i:あなたのホームディレクトリのパスに置き換え)を展開されていません。

最初のプログラムのようにコマンドラインで引数として指定すると、がシェルに展開されます。

1

シェルは、プログラムを実行する前に〜を正しい名前に展開しています。これはargv [1]にあります。

ハードコードされていると、明らかに名前を自動拡張していません。

関連する問題