операторы — альтернативная проблема strcat Переполнение стека

Я работаю над проектом, который был первоначально выбран в C, но хочу работать над ним в C ++.

Есть раздел, где используется strcat (), мне сказали использовать альтернативу. Я нашел один Вот, но когда я пытаюсь это сделать, компилятор выдает мне следующую ошибку:

ошибка: недопустимые операнды типов char*' andchar * ‘к бинарному оператору +

Есть ли что-то, что я делаю не так?

Редактировать:

Вот часть кода, которая не работает

FILE *FileOpen(string *fname, string* mode){
FILE *fp;
string *str = "";

str += "tmp/"; //all files to be created in temporary sub directory
str += fname;
if((fp=fopen(str,mode))==NULL){
fprintf(stderr,"Cannot open file: %s\n", &fname);
exit(1);
}
FileReader(fname);
return(fp);
}

Изменить 2:
Для тех, кто интересуется, почему у меня есть FileReader: это для второй части проекта. Разборка кода.

0

Решение

Спасибо за размещение вашего кода; Теперь проблема очевидна.

Вы должны использовать строковые объекты, а не указатели на них.

FILE *FileOpen(string fname, string mode)
{
string str = "";

str += "tmp/"; //all files to be created in temporary sub directory
str += fname;
FILE *fp = fopen(str.c_str(), mode.c_str());
if (!fp) {
fprintf(stderr, "Cannot open file: %s\n", fname.c_str());
exit(1);
}
FileReader(fname);
return fp;
}

Хорошим следующим шагом будет переход к функциям ввода / вывода, которые принимают std::string аргументы, так что вам не нужно говорить .c_str() везде.

Я также запутался, почему у вас FileReader(fname) внутри вашей функции открытия файлов. Это дважды нарушает принцип единой ответственности. Открытие файла не должно вызывать его чтение, и код, читающий файл, должен использовать FILE* и не важно, какое имя файла (кроме, возможно, для генерации сообщений об ошибках).

1

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

Вы не показали никакого кода, но я подозреваю, что у вас было что-то вроде этого

char *s1 = "Hello, ", *s2 = "world!";
char buf[50];
strcpy(buf, s1);
strcat(buf, s2);

и теперь вы изменили его на

char *s1 = "Hello, ", *s2 = "world!";
char buf[50];
buf = s1 + s2;

Это не работает, как вы уже заметили. Вы должны изменить указатели на символы и массив символов на std::string также

std::string s1 = "Hello, ", s2 = "world!";
std::string buf = s1 + s2;
1

Если ваш код использует char * как строки strcat это, вероятно, правильная функция для вас. Конечно, решение C ++ заключается в использовании std::stringв этом случае вы можете просто использовать + — так как есть двоичный operator+ доступны для std::string,

0

ну, в C ++ есть строковый класс std::string чей оператор + выполняет конкатенацию. Но сначала нужно создать.

так что выражение"abc" + "def" не компилируется, но std::string("abc")+"def" работает отлично.

В качестве альтернативы вы можете написать что-то вроде

std::string s("abc");
s += "def";

так же,

std::string s = "abc";
s += "def";

если вы хотите объединить большой объем текста и заботиться о производительности, рассмотрите возможность использования std::ostringstream,

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