0

我在这里花了很多时间寻求帮助,以解决显然是常见错误的问题,但我所看到的似乎都不适合我的情况。

我正在将一个用 Visual Studio 6 C++ 编写的旧外源程序迁移到 Visual Studio 2012,幸运的是我不是 C++ 程序员(只是一个低级的 VB 和 C# 开发人员)。迁移向导和 Internet 在帮助我查找和更正向导无法处理的代码方面提供了很大帮助。

在这个代码块中,我相信它只不过是创建一个目录

int CreateAllDirectories(const char* pszDir)
{
char*   pszLastSlash;
char    cTmp;


if( _access( pszDir, 0 ) != -1 ) {
    // it already exists
    return 0;
}

pszLastSlash = strrchr( pszDir, '\\' );
if ( pszLastSlash ) {
    cTmp = *pszLastSlash;
    *pszLastSlash = '\0';

    // try again with one less dir
    CreateAllDirectories( pszDir ); 

    *pszLastSlash = cTmp;
}

if ( _mkdir( pszDir ) == -1 ) {
    return -1;
}

return 0;

}

将 strrchr( pszDir, '\' ) 的结果分配给变量 pszLastSlash 时会产生错误。从这段代码的其余部分看起来像 pszLastSlash = strrchr( pszDir, '\' ); 是一个有效的表达式。

对我来说看起来像双反斜杠和转义序列的问题是什么。

4

3 回答 3

3

也许在这一行...

pszLastSlash = strrchr( pszDir, '\\' );

pszLastSlash不是恒定的,而是pszDir恒定的。有两个定义strrchr()(参见http://www.cplusplus.com/reference/cstring/strchr/)...

const char * strchr ( const char * str, int character );
      char * strchr (       char * str, int character );

因为你输入了一个常量 char *,它会尝试使用返回一个 const char* 的 def,但是你将它分配给一个非 const char*。我认为这就是产生错误的原因。

因为pszDir是 const,所以返回给您的指针是 const,因为您不应该修改 . 指向的内存区域pszDir

如果您已经分配pszDir了自己,并且您知道修改是安全的,那么您可以放松函数 def 中的 const 约束吗?IE,

int CreateAllDirectories(char* pszDir)

但是,只有pszDir你拥有并且可以修改的字符串:)

我刚刚在 C++ 参考页面中注意到...

In C, this function is only declared as:
    char * strchr ( const char *, int ); 

因此,如果您以前使用过 C,那么这将解释您现在看到错误的原因。

于 2013-05-01T16:19:06.137 回答
0

由于这条线

*pszLastSlash = '\0';

正在修改传递给你的函数的缓冲区,你不能向你的调用者保证你不会修改缓冲区。所以

int CreateAllDirectories(char* pszDir);

是正确的签名

于 2013-05-01T16:41:55.690 回答
0

您可以尝试将 new 放在中间

pszLastSlash = strrchr( pszDir, '\' );

所以,这将是

:pszLastSlash = new strrchr( pszDir, '\' );
于 2016-03-17T13:22:40.020 回答