C ++ - я выделил массив символов и содержимое ``b - PullRequest
1 голос
/ 29 ноября 2011

Я хочу объединить два const char *, но когда я сделаю это, я получу следующие символы: `�b

Я делаю следующее:

 char* path = new char[strlen(args->targetFileName) + strlen(args->targetFilePath)];
cout << path << endl;
strcat(path,args->targetFilePath);
cout << path << endl;
strcat(path,args->targetFileName);
cout << path << endl;

Вывод:

`�b
`�b/home/user/Arbeitsfläche/
`�b/home/user/Arbeitsfläche/Auto.png

В чем вина ??Любые предложения ??

Ответы [ 3 ]

6 голосов
/ 29 ноября 2011

Вы не инициализировали переменную path.Вы выделили для него память, но изначально она содержит мусор, который случайно имеет нулевое значение.Затем вы объединяете строку, поэтому ваш путь добавляется к мусору.Замените первый strcat на strcpy, и вы должны быть правы.

2 голосов
/ 29 ноября 2011

Массив содержит неинициализированную память. Ваш strcat ищет первый 0 байт, и нет никакой гарантии, где он находится, или если он вообще есть (в этом случае strcat будет даже искать выделенную память, вероятно, воплощая вызванный UB как авария).

Установите первый байт на 0 при использовании strcat или, что еще лучше, используйте C ++ и используйте std::string.

1 голос
/ 29 ноября 2011

Научитесь использовать отладчик (например, gdb в Linux) и запросите все предупреждения от вашего компилятора (например, g++ -Wall -g в Linux).

Вы выделили, но не сделализаполните свой массив.Попробуйте возможно

 size_t targetfilenamelen = strlen(args->targetFileName);
 size_t targetfilepathlen = strlen(args->targetFilePath);
 char* path = new char[targetfilenamelen+targetfilepathlen+1]; // extra zero byte
 strcpy (path, args->targetFileName);
 strcat (path, args->targetFilePath);

Еще лучше, используйте std::string Например

 std::string name(args->targetFileName);
 std::string path(args->targetFilePath);
 std::string res = name+path;
...