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));
}
Я думаю, что вы можете улучшить свой код:
Создание указателя входной строки
const
(т.е.const char* myData
), чтобы отметить этоmyData
является входной строкой, и ее содержимое не изменяется функцией.Передайте размер буфера назначения, чтобы в вашей функции вы могли делать правильные проверки и избегать переполнения буфера (враг безопасности).