C String Passing

Если я читаю строку C, например: char myData[100]; и я хочу обработать эти данные и создать копию из них, поэтому мой код выглядит так:

char myData[100], processedData[50];

loop
    fill myData from file...
    setProcessedData(myData, processedData);
    store processedData to file...

где setProcessedData - это функция, которая возвращает обработанную строку. скажем для простоты возвращает подстроку

void setProcessedData (char *myData, char *processedData) {
     memCopy( processedData, myData, 5);
}

Что я делаю что-то не так? Как создание дополнительных объектов / строк? Есть ли лучший способ сделать это?

Допустим, я читаю строку из файла, который содержит * Я * A T*est String* Но Ho*w для обработки *. Я хочу получить подстроку, которая имеет первые 3 с. Таким образом, мои обработанные данные Я * Строка *

и я хочу сделать это для всех строк файла максимально эффективным.

Спасибо

2 ответа

Решение

Проблема в том, что ваша функция небезопасна, потому что вы делаете предположение о распределенной памяти по параметрам, которые вы передаете функции.

Если кто-то собирается позвонить setProcessedData если передать строку длиной менее 5 байтов, произойдут плохие события.

Кроме того, вы копируете память с memcpy используя необработанное измерение, более безопасный подход, даже если он достаточно требователен в этой ситуации, заключается в использовании sizeof(char)*5,

Лучшее, что вы можете сделать, это следовать тому же подходу, который используется более безопасными функциями стандартной библиотеки, такими как strcpy против strncpy: вы передаете третий параметр, который является максимальной длиной, которая должна быть скопирована, например:

void processData(const char *data, char *processedData, unsigned int length) {
  memcpy(processedData,data,length*sizeof(char));
}

Я думаю, что вы можете улучшить свой код:

  1. Создание указателя входной строки const (т.е. const char* myData), чтобы отметить это myData является входной строкой, и ее содержимое не изменяется функцией.

  2. Передайте размер буфера назначения, чтобы в вашей функции вы могли делать правильные проверки и избегать переполнения буфера (враг безопасности).

Другие вопросы по тегам