2017-06-06 117 views
0

在此代码中,字符长度突然变化。在介绍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; 
} 
+0

这是什么问题? – Wilson

+2

你的缓冲区'str'太短。你为什么不使用'std :: string'? –

回答

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"; 

你应该与所有警告编译&调试信息(例如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]; 

BTW在GNU系统(如Linux),你可以使用asprintf(3)strdup(3)(和使用freedelete来释放内存),并考虑使用valgrind