2014-11-24 62 views
0

我在与改变字符指针的一些问题,并不能找出我要去哪里错了问题与改变一个const char指针

这里是我的改变说明功能...

void appointment::changeDescription(const char * s) // change an existing description 
{ 

if (desc != NULL) 
    strcpy(desc, s); 

if (s == NULL) 
    return; 

} 

这里是调用变更描述函数的函数。

bool keyBoardEnterAppointment(schedule & sched) // return true if successful 
// return false if full 
{ 
    if (sched.isFull() == true) 
    { 
     cout << "Schedule is FULL." << endl; 
     return false; 
    } 
    else 
    { 
    appointment s; 
    int day, month, year; 
    char *desc = new char; 
    long source; 

    cout << "*/Enter Appointment\\* "; 
    cout << "Description: "; cin >> desc; 
    cout << "Source: "; cin >> source; 

    cout << "Month: "; cin >> month; 
    cout << "Day: "; cin >> day; 
    cout << "Year: "; cin >> year; 

    s.changeDescription(desc); 
    s.setSource(source); 
    s.setDay(day); 
    s.setMonth(month); 
    s.setYear(year); 
    sched.addtoSchedule(s); 

    sched.print(cout); 

    return true; 
} 

}

它编译和运行,但说明仍然是一样的默认构造函数说明...

+5

让自己的生活更轻松,只需使用'std :: string'。 – shuttle87 2014-11-24 00:47:58

+5

'char * desc = new char;'这只为一个字母分配足够的内存。也许尝试:'char * desc = new char [32]; // 31个字母(终止符+1)'。或者char'desc [32];'那么你不必'删除'它(你在这里没有做的)。 – Galik 2014-11-24 00:48:23

+0

不应该先检查's'是否为空? – 2014-11-24 01:00:16

回答

2

如果使用std::string存储在约会类的描述,那么你可以做对于自己以及最终处理代码的人来说,事情要简单得多。然后changeDescription方法将成为这个:

#include <string> 

void appointment::changeDescription(std::string const& s){ 
    this->desc = s; 
} 

并更改调用代码如下:

std::string desc; 

然后所有恼人的内存管理使你面对固定非常自由的问题(就编程工作而言)。一般来说,这被认为是比使用空终止的C风格字符数组更好的惯用C++代码。

关于你的代码的另一件事是你真的应该检查s不是null,然后再尝试复制它,而不是之后。

+2

实际上,按值赋予参数并在赋值时使用'std :: move'是个好主意。 – Deduplicator 2014-11-24 00:58:40

+0

@Deduplicator,如果有'std :: move'可用我完全同意这是做到这一点的方法。发布这个答案,我很可能会赞成它。我只是想为问题中的内容做一个简单的“放下”替换。 – shuttle87 2014-11-24 01:01:17