2017-06-06 115 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