Почему этот работающий код не печатает последнее значение строки, которое является /? - PullRequest
0 голосов
/ 11 июня 2019

Я использую PATH с именем ncdir (указатель внешнего символа), который используется в файле других пользователей для чтения файла netcdf.

string temp = "/mnt/BIOPHY-RO/Model_AIFS/AIFS_LFN/";
ncdir = (char*) calloc (temp.length(),sizeof(char));
strcpy (ncdir, temp.c_str());
cout<<"last element of the string: "<<ncdir[sizeof(ncdir)]<<endl;

Я ожидаю вывод P вместо N (последний символ в буквальной строке)

1 Ответ

3 голосов
/ 11 июня 2019

Для начала вы забыли зарезервировать память для конечного нуля

cdir = (char*) calloc (temp.length(),sizeof(char));

А во-вторых, выражение sizeof(ncdir) дает размер указателя ncdir, а не размер указанного массива.

Учтите, что последним символом строкового литерала является '/' bur, а не 'N'.

Примечание: Если на самом деле это код C ++, то вместо стандартной функции C calloc используйте оператор new для выделения памяти.

Вот демонстрационная программа

#include <iostream>
#include <string>
#include <cstring>

int main()
{
    std::string temp = "/mnt/BIOPHY-RO/Model_AIFS/AIFS_LFN/";

    char *ncdir = new char[temp.size() + 1];

    std::strcpy ( ncdir, temp.c_str() );

    std::cout << "last element of the string: " << ncdir[std::strlen( ncdir ) -1] << std::endl;

    delete [] ncdir;
}

Его вывод

last element of the string: /
...