2

希望这很容易做到。我正在用 C 语言编写一个需要在 Windows 和 Linux 上运行的程序。在 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

你的内存管理有缺陷。首先,您声明 achar *val[100]而不是char val[100]。然后,您尝试通过引用返回那个非常本地的地址,这是未定义的行为。您最好将缓冲区作为参数传递给函数,并使其成为一个字符数组。不是指针数组。

哦,您将字符串文字 ( "SERVER1") 转换为 a 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

我知道这对您的程序没有帮助,但出于功能的考虑,您可以试试这个 Perl 单线。

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

这可以在多个文件上工作,并将所有正斜杠替换为反斜杠。

于 2012-06-25T18:57:23.517 回答
0

您的函数的内存管理存在问题。您正在返回一个指向本地分配内存的指针。试试这个通用的字符串替换函数:在 C 中替换字符串的函数是什么?

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

您已在此处声明为指针val数组。它应该是一个数组。char

因此,您在非空时遍历指针数组。val[index]这是一个问题。您不是在遍历字符串并比较字符,而是在比较指向\\.

您还应该增加index每次迭代,不仅在找不到匹配项时,尽管这不是问题的根源。

于 2012-06-25T18:24:17.857 回答