Что не так с этой функцией? - PullRequest
4 голосов
/ 27 февраля 2010

У меня сегодня проблема. У него был метод, и мне нужно найти проблему в этой функции. Цель функции - добавить новую строку в передаваемую строку. Ниже приведен код

char* appendNewLine(char* str){
    int len = strlen(str);
    char buffer[1024];
    strcpy(buffer, str);
    buffer[len] = '\n';
    return buffer;
}

Я обнаружил проблему с этим методом. Своего рода прямо вперед. Этот метод может привести к тому, что индекс массива выйдет за пределы диапазона. Это не мое сомнение. В Java я использую '\ n' для перевода строки. (Я в основном программист на Java, я много лет работал в C). Но я смутно помню, что \ n означает обозначение завершения строки в C. Это также проблема с этой программой?

Пожалуйста, сообщите.

Ответы [ 13 ]

1 голос
/ 27 февраля 2010

Есть несколько проблем с кодом:

  • Может переполнить буфер, поскольку buffer жестко задан для выделения только 1024 символов. Хуже того, буфер даже не выделяется в куче.
  • Символ новой строки "характер" фактически зависит от операционной системы. Строго говоря, это только \n в Unix и т. Д. В Windows и в строгом интернет-протоколе это, например, \r\n.
  • Строка, возвращаемая функцией, не заканчивается нулем. Скорее всего, это не то, что вам нужно.

Кроме того, принимая во внимание ваш опыт работы с Java, необходимо учитывать следующее:

  • Поскольку вы работаете с C char*, а не с (неизменяемыми) строками Java, может быть, вы могли бы добавить новую строку на месте?
  • Доступ к массиву больше не проверяется во время выполнения, поэтому вы должны быть ОЧЕНЬ осторожными при выходе за пределы. Убедитесь, что все буферы имеют соответствующий размер.
  • Язык не поставляется со стандартной автоматической сборкой мусора, поэтому, если вы решите выделить новые буферы для работы со строками, убедитесь, что вы правильно управляете своей памятью и не протекаете повсюду.
0 голосов
/ 27 февраля 2010

Может быть, \ n должно быть \ r \ n. Возврат + новая строка. Это то, что я всегда использую и работаю для меня.

0 голосов
/ 27 февраля 2010

C строка должна заканчиваться '\0'.

buffer[len+1] = '\0';

Вы должны динамически распределять буфер как указатель на символ размера len:

char *buffer = malloc(len*sizeof(char));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...