2

うまくいけば、これは簡単に行うことができます。Windows と Linux で実行する必要があるプログラムを C で作成しています。Linux では問題なく動作しますが、Windows (Cygwin 経由) では、環境変数のパスにスラッシュではなくバックスラッシュが含まれているため、失敗します。これらを置き換える方法はありますか?私は次のことを試しましたが、おそらくバックスラッシュが次の文字をエスケープしていると思われるため、何も変わりませんでした。これが私が試したことです:

char* fixPath(char *env)
{
    char *val[100];
    strcpy(val, getenv(env));
    int index = 0;
    while(val[index])
    {     
         if(val[index] == '\\')
            val[index] = '/';
         else
            index++;
    }
    printf("\n***%s",val);
    return val;
};

int main(int argc, char *argv[])
{
    char *test1;
    test1 = fixPath("SERVER1");
    printf("\n*****%s",test1);
...
}

これを行う正しい方法は何ですか?

4

5 に答える 5

4

主な問題:

(1)

char *val[100];

次のようにする必要があります。

char val[100];

(2)

valスコープ外になるため、関数の結果としてローカル変数 ( ) を返すことはできません。

マイナーな問題:

ここではロジックが間違っています。

while(val[index])
{     
     if(val[index] == '\\')
        val[index] = '/';
     else
        index++;
}

そのはず:

while(val[index])
{     
     if(val[index] == '\\')
        val[index] = '/';
     index++;
}

これは致命的ではありませんが。

于 2012-06-25T18:22:20.450 に答える
2

メモリ管理に欠陥があります。まず、char *val[100]代わりにa を宣言しますchar val[100]。次に、その非常にローカルなアドレスを参照によって返そうとしますが、これは未定義の動作です。バッファを引数として関数に渡し、文字の配列にすることをお勧めします。ポインターの配列ではありません。

"SERVER1"ああ、文字列リテラル ( ) を にキャストしていますがchar*、これも悪いことです。にしconst char*ます。

void fixPath(const char* env, char* fixed)
{
//...
}

int main(int argc, char *argv[])
{
    char test1[100];
    fixPath("SERVER1", test1);
    printf("\n*****%s",test1);
...
}

もちろん、100の固定バッファサイズを使用することは危険ですが、回答で参照できる問題は非常に多くあります...

于 2012-06-25T18:24:42.427 に答える
0
char *val[100];
strcpy(val, getenv(env));
int index = 0;
while(val[index])
{     
     if(val[index] == '\\')
        val[index] = '/';
     else
        index++;
}

ここではポインタvalの配列として宣言しています。の配列である必要があります。char

そのため、 null 以外のポインターの配列をループします。val[index]それは問題です。文字列をループして文字を比較するのではなく、へのポインタを比較しています\\

indexまた、一致が見つからない場合だけでなく、各反復をインクリメントする必要がありますが、これは問題の原因ではありません..

于 2012-06-25T18:24:17.857 に答える
0

これがあなたのプログラムに役立たないことはわかっていますが、機能のために、この Perl ワンライナーを試すことができます。

perl -pi -e 's/\//\\/g' filename(s) 

これは複数のファイルで機能し、すべてのスラッシュをバックスラッシュに置き換えます。

于 2012-06-25T18:57:23.517 に答える
0

関数のメモリ管理に問題があります。ローカルに割り当てられたメモリへのポインターを返しています。この一般的な文字列置換関数を試してください: What is function to replace string in C?

于 2012-06-25T18:26:21.753 に答える