Что-то не так с программой? - PullRequest
0 голосов
/ 30 июня 2011
#include <iostream>
#include <cstring>
using namespace std;
int main() {
  char sor[6] = "hello";
  char des[6] = "hello";
  strcat(des,sor);
  cout << des;
}

Когда я запускаю отладку программы, она выдает следующую ошибку вместе с выводом на консоль (за ним) : enter image description here

почему это так? Если что-то не так с кодом, пожалуйста, дайте предложение

Ответы [ 6 ]

4 голосов
/ 30 июня 2011

Хотя увеличение размера string char-array может помочь вам в этой ситуации, позвольте мне предложить на самом деле использовать функции C ++;не кодируйте C, если хотите кодировать C ++:

#include <iostream>
#include <string>
using namespace std;
int main() {
  string sor = "hello";
  string des = "hello";
  des += sor;
  cout << des;
}

Почему бы не массивы char

Сухайль спросил, почему массивы char плохие:

Не следуетиспользовать char-массивы из-за подобных ситуаций.Существует много более опасных ситуаций;фактически, когда вы используете массивы C, существует определенная опасность того, что ваша программа подвергнется атакам переполнения буфера.

На самом деле вам очень повезло, что вы получили прямое исключение;но чаще, чем вам нравится, эти ошибки неуловимы и не раскрываются в течение дней, месяцев, лет;и тогда, возможно, ваш клиент будет в ежедневных новостях за то, что его взломали и потеряли информацию о кредитных карточках своих клиентов в открытом доступе.

Используя средства C ++, такие как string или stringstream, этого можно избежатьлегко.


4 голосов
/ 30 июня 2011

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

1 голос
/ 30 июня 2011

des имеет место только для 6 байтов, и вы пытаетесь вписать в него 11 байтов 5 + 5 + 1:

'h'+'e'+'l'+'l'+'o'+'h'+'e'+'l'+'l'+'o'+'\0'

это приводит к повреждению стека (поскольку des является автоматической переменной) это причина того, что cout работает, но программа вылетает, как только она пытается вернуться.Это работает, если вы объявите des[11].

0 голосов
/ 30 июня 2011

strcar объединяет строки.Вы должны убедиться, что для этого достаточно места.в вашем случае - вы выделили память на 6 символов, когда объединенная строка будет иметь 11 символов (10 символов и \ в конце)

0 голосов
/ 30 июня 2011

strcat добавляет второй параметр в конец первого. Это означает, что в вашем случае общая длина объединения будет 11 символов, в то время как des имеет только место, достаточное для хранения 6. Измените des[6] на des[11], и ваша программа будет работать нормально. Также проверьте эту ссылку для получения дополнительной информации о strcat.

0 голосов
/ 30 июня 2011

попробуйте выделить память перед использованием массивов. Надеюсь это поможет И, как предложил Gunner, попытайтесь распределить память в соответствии с размером того, что вы собираетесь поместить в массивы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...