функция strcpy продолжает падать - PullRequest
0 голосов
/ 14 января 2020
#include <iostream>
using namespace std;

определение класса

class fancyString {
private:
    char *content;
    bool flag_bold;
    bool flag_italics;
public:
    fancyString(){
        content="";
        flag_bold= false;
        flag_italics=false;
    }

в обеих функциях Меня просят использовать старомодный вызов c

    fancyString(char* cntnt){
        content=(char *) calloc(strlen(cntnt)+1, sizeof(char*));

Обычно главной причиной является strcpy the cra sh

        strcpy(cntnt,content);
    }
    fancyString(fancyString & f1){
        content=(char *) calloc(strlen(f1.content)+1, sizeof(char*));

Обычно strcpy является основной причиной основной функции cra * sh

           strcpy(f1.content,content);
        flag_bold=f1.flag_bold;
        flag_italics=f1.flag_italics;
    }
   friend ostream& operator<<(ostream& os, const fancyString& FS){
       os<<"string is "<<FS.content<<endl<<"bold status is "<<FS.flag_bold<<endl<<"italics status is "<<FS.flag_italics<<endl;
       return os;
    }
    ~fancyString(){
       cout << "Destroying the string\n";
        if ( content != NULL )
            free (content);
    }
};

int main(int argc, const char * argv[]) {

    fancyString fs1 ("First Example");
     fancyString fs2(fs1);
    cout<<fs2;
    return 0;
}

1 Ответ

4 голосов
/ 15 января 2020

У вас есть аргументы для вызовов strcpy неверно! См. Определение в cppreference :

char * strcpy (char * destination, const char * source);

Итак, в вашем первом конструктор, вызов:

strcpy(cntnt,content);

пытается скопировать вновь выделенный буфер в переданный аргумент, который на самом деле является (постоянным) строковым литералом:

int main(int argc, const char * argv[]) {
   fancyString fs1 ("First Example");
//...

ЗАМЕЧАНИЯ , основанные на предложениях, высказанных в комментариях:

(1) Обратите внимание, что в вашем вызове calloc, который выделяет «массив» из char, размер элементов равен sizeof(char) not sizeof(char*) (что подходит для «массива» указателей). Используйте:

    content = (char *) calloc(strlen(cntnt)+1, sizeof(char));

и аналогично в конструкторе копирования.

(2) Предполагая, что ваш первый конструктор никогда не предназначен для изменения строки, заданной в качестве аргумента, Вы должны действительно указать это как const:

fancyString(const char* cntnt){
  //...

(Это указало бы на ошибку, если strcpy аргументы неверны!)

Пожалуйста, не стесняйтесь просить дальнейших разъяснений и / или объяснение.

...