Я могу назначить переменную c-style переменной и передать ее функции, и я могу cin/cout строку c-style, но я не могу сгенерировать строку c-style, а затем передать ее функции. Как мне это сделать?
#include <iostream>
#include <string.h>
class SzString // edit 2: changed to Upper Camel for class name (Thanks Rabbiya Shahid)
{
int m_length;
char* m_szString;
public:
void SetString(char* szString) // b) line on which program crashes after call from 'line a'
{
m_szString = szString;
m_length = strlen(szString);
}
char* GetString()
{
return m_szString;
}
};
SzString aString;
int main()
{
using namespace std;
cout << "Enter a string: ";
char* szString; // line x (referenced following 'EDIT:')
cin >> szString;
aString.SetString(szString); // line a
cout << endl << aString.GetString();
return 0;
}
РЕДАКТИРОВАТЬ:
Я исправил это двумя способами. Во-первых, я перешел на использование std :: string, как мне было сообщено, затем я вернулся к c-style Strings и исправил его вторым способом, изменив строку x: char* szString
на char* szString = new char
(на основе напоминания что char* szString
не выделяет пространство).
Редактировать 3: (Спасибо πάντα ῥεῖ)
Добавлена следующая строка для строковой версии кода c-стиля после строки "a", чтобы предотвратить утечку памяти:
szString = 0;
delete[] szString;
В main
функции у вас есть определение
char* szString;
Это говорит компилятору, что szString
является указателем на символы. Но вы не заставляете этот указатель на самом деле указывать на что-либо.
Поэтому, когда вы используете его для ввода ввода, операция ввода будет записывать вход в неизвестное местоположение. Это неопределенное поведение и приведет к тому, что ваша программа будет вести себя непредсказуемо, включая сбой.
Либо вы должны указать точку указателя на некоторое допустимое местоположение. Или даже лучше, не используйте указатели для строк, используйте std::string
.
char* szString;
cin >> szString;
Этот код не делает то, что вы можете себе представить! Чтобы ввести строку из использования cin
:
std::string s;
cin >> s;
Измените дальнейшие вхождения char*
в std::string
, std::string&
соответственно.
std::string
.char*
, не выделяя места дляchar
.