字符串长度突然改变

时间:2017-06-06 07:35:46

标签: c++11

此代码中,字符长度突然变化。在引入char 文件之前,strlen(str)是正确的。当我介绍新的char 文件时,变量str的strlen值会发生变化。

#include <unistd.h>
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

int main(){

    char buf[BUFSIZ];

    if(!getcwd(buf,BUFSIZ)){
            perror("ERROR!");
    }

    cout << buf << endl;

    char *str;
    str = new char[strlen(buf)];
    strcpy(str,buf);
    strcat(str,"/");
    strcat(str,"input/abcdefghijklmnop");
    cout << str << endl;
    cout << strlen(str) << endl;

    char *file;
    file = new char[strlen(str)];
    cout << strlen(file) << endl;
    strcpy(file,str);
    cout << file << endl;
}

1 个答案:

答案 0 :(得分:1)

由于undefined behavior,您的代码已buffer overflow。你应该是scared

您应该考虑使用std::string

  std::string sbuf;
  {
      char cwdbuf[BUFSIZ];
      if (getcwd(cwdbuf, sizeof(cwdbuf))
        sbuf = cwdbuf;
      else { 
        perror("getcwd");
        exit(EXIT_FAILURE);
      }
 }
 sbuf += "/input/abcdefghijklmnop";

你应该编译所有警告&amp;调试信息(例如g++ -Wall -Wextra -g)然后使用调试器gdb 。别忘了字符串是零字节终止的。你的str太短了。如果你坚持要避免std::string(你不应该使用恕我直言),你需要分配更多的空间(并记住额外​​的零字节)。

str = new char[strlen(buf)+sizeof("/input/abcdefghijklmnop")];
strcpy(str, buf);
strcat(str, "/input/abcdefghijklmnop");

请记住,sizeof某些文字字符串比其长度多一个字节(由strlen衡量)。例如sizeof("abc")是4。

同样,您的file变量的一个字节太短(缺少终止零字节的空间)。

file = new char[strlen(str)+1];
在GNU系统(例如Linux)上使用BTW,您可以使用asprintf(3)strdup(3)(并使用free而不是delete来释放内存)并考虑使用{{ 3}}