STRCAT同时更改两个变量

时间:2014-12-11 13:00:40

标签: c++

我有一段代码出现故障,我不知道它是如何做它正在做的事情。

我想做的是:

  1. 拥有一个接收目录名path和文件名filename
  2. 的函数
  3. 将这些2复制到另一个变量caminho
  4. 将文件从当前目录复制到收到的文件。
  5. 我的问题代码是:

    void fileTransfer(const char* filename, const char* path, bool ts)
    {
      std::cout << filename << std::endl;
      char *caminho;
      caminho[0] = '\0';
      std::cout << "0 " << caminho << ' ' << filename <<  std::endl;
      strcat(caminho, path);
      std::cout << "1 " << caminho << ' ' << filename << std::endl;
      strcat(caminho, "\\");
      std::cout << "2 " << caminho << ' ' << filename << std::endl;
      strcat(caminho, filename);
      std::cout << "3 " << caminho << ' ' << filename << std::endl;
    
      //does the rest
    }
    

    这段代码应该做的是打印这样的东西:

    file.txt
    0 file.txt
    C:\Users\Username file.txt
    C:\Users\Username\ file.txt
    C:\Users\Username\file.txt file.txt
    

    但是这段代码实际打印的是:

    file.txt
    0 
    C:\Users\Username C:\Users\Username
    C:\Users\Username\ C:\Users\Username\
    C:\Users\Username\C:\Users\Username\C C:\Users\Username\C:\Users\Username\C
    

    在所有strcat之前,我已经打印filename并且这是正确的。任何人都可以看到这段代码有什么问题吗?

2 个答案:

答案 0 :(得分:4)

caminho并未指向任何地方。你正在覆盖随机记忆。

为什么你甚至使用C字符串操作?使用std::string

答案 1 :(得分:2)

您没有在要复制路径和文件名的位置分配内存。您只定义了一个指针,而且还没有初始化。

正确的功能可能看起来像

void fileTransfer( const char* filename, const char* path, bool ts )
{
    size_t n = strlen( path ) + strlen( filename ) + sizeof( "\\" );

    // char *caminho = malloc( n * sizeof( char ) ); for C or
    char *caminho = new char[ n ];

    caminho[0] = '\0';

    strcat( caminho, path );
    strcat( caminho, "\\" );
    strcat( caminho, filename );

    //does the rest
}

当不再需要组合字符串时,不要忘记释放已分配的内存:

free( caminho ); // for C
delete [] caminho; // for C++

请注意,当您使用C ++时,可以使用class std :: string。

例如

std::string caminho( path );

caminho += "\\";

caminho += filename;

如果您需要获取字符串,则可以使用成员函数c_str。例如

caminho.c_str()