Необработанное исключение при преобразовании const char в char

Последние 30 минут я пытался преобразовать const char в char.
Вот что у меня есть.

 string atr;

getline(cin,atr); // Start off with a string because getline takes nothing else.
const char *buffA = atr.c_str(); // Create a const char of the string converted to a const char.
char *buff = ""; // Create a new char to hold the converted result.
strcat(buff,buffA); // Do the conversion.
parseargs(buff); // Pass the data on.

Однако я получаю необработанное исключение. Понятия не имею почему. Я буквально просто набрал ‘try’ в консоли как единственный аргумент.

1

Решение

Есть две вещи не так с вашим кодом. Ты первый
инициализировать char* со строковым литералом. Это использует
устаревшее преобразование; тип строкового литерала char
const[]
(который преобразуется в char const*не char*),
потому что любая попытка изменить литерал является неопределенным поведением.
Во-вторых, ваш строковый литерал только один char долго,
так что даже если бы вы могли написать ему, если atr был пуст, ты
запись за пределы буфера.

Вы не говорите нам ничего о parseargs, Если это не так
изменить его аргумент, вы можете просто передать его atr.c_str(), и быть
сделано с этим. (Если это устаревшая функция, которая игнорирует const,
вам, возможно, придется использовать const_cast здесь.) Если это изменить его
аргумент (скажем, потому что он использует strtok), тогда вам придется
явно нажать '\0' на конец atr, а затем передать его
&atr[0], (Не особо чистое решение, но если вы
не используется atr потом должно сработать.)

5

Другие решения

Попробуйте использовать C ++ вместо C идиом:

std::vector<char> data(atr.begin(), atr.end());
data.push_back('\0');
parseargs(&data[0]);
8

Оба ваших содержания buff а также buffA находятся в доступной только для чтения памяти процесса.
Вам действительно нужно new ваш buff лайк

char* buff = new char[32];

Это обеспечивает память из бесплатного магазина, и вы можете затем strcat строка из buffA в buff,
Вы должны предпочесть strncatОднако, чтобы избежать переполнения буфера и delete ваш buff в конце концов.

4

это

char *buff = ""; // Create a new char to hold the converted result.

создает char * это указывает на (вероятно, только для чтения) память объемом около 1 байта. Это:

 strcat(buff,buffA); // Do the conversion.

пытается перезаписать эту (возможно, только для чтения) память объемом около 1 байта произвольной строкой.

Скорее всего, это быстро потерпит крах. Если память доступна только для чтения, она немедленно выйдет из строя. Если память не только для чтения, она будет вытеснять случайные данные, что приведет к очень неопределенному поведению.

С какой стати ты хочешь это сделать? Есть ли parseArgs на самом деле нужна модифицируемая строка? Это разбор аргументы, их не нужно менять. Если это действительно необходимо, используйте std::vector<char> и передать адрес первого элемента и надеяться, что все, что он делает, — это копает содержимое массива, а не, скажем, работает через конец.

2
По вопросам рекламы [email protected]