я могу получить строку между двумя строками с помощью следующей функции:C: Получение строки, содержащие пробелы между двумя строками
char* parsedData = NULL;
const char* const parseData(char* theString, char* start, char* end){
if (!theString) return 0;
size_t startSize = strlen(start);
char* startP = strstr (theString,start);
if(!startP)
return 0;
startP+=startSize;
char* endP = strstr ((startP),end);
if(!endP)
return 0;
//free(parsedData);
parsedData = NULL;
parsedData = (char*) malloc((size_t)(sizeof(char)*(endP-startP)+1));
if (parsedData == NULL) {
return 0;
}
int dataPos=0;
while (startP != endP){
parsedData[dataPos++]= *startP++;
}
parsedData[dataPos]= '\0';
return parsedData;
}
Есть две проблемы, которые я имею здесь.
Это работает, когда моя строка не содержит пробелов, но не делает иначе. Когда я печатаю строку, я получаю только (null).
Когда я раскомментирую строку
free()
, я получаю ошибкуmunmap_chunk(): invalid pointer:
и программа вылетает из строя.
Как это решить?
/**************************************** EDIT 1 ** **************************************/
После ответа Стин я понял проблема 1 связана с отсутствием проверки ошибок в другом месте. Я подтверждаю, что функция работает как с пробелами, так и без них.
/**************************************** EDIT 2 ** **************************************/
Я изменил следующий код предложения Гайда:
const char* const parseData(char* theString, char* start, char* end){
char* tmpstr;
if (!theString) return 0;
size_t startSize = strlen(start);
char* startP = strstr (theString,start);
if(!startP) return 0;
startP+=startSize;
char* endP = strstr ((startP),end);
if(!endP) return 0;
if (parsedData != NULL){ free(parsedData);}
parsedData = NULL;
parsedData = (char*) malloc((size_t)(sizeof(char)*(endP-startP)+1));
if (parsedData == NULL) {
return 0;
}
int dataPos=0;
while (startP != endP){
parsedData[dataPos++]= *startP++;
}
parsedData[dataPos]= '\0';
tmpstr = parsedData;
return tmpstr;
}
Я вызываю функцию таким образом:
const char* const usr1 = parseData(buffer, ":", ",");
const char* const usr2 = parseData(buffer, ",", ".");
const char* const usr3 = parseData(buffer, "(", ")");
printf("%s, %s, %s\n", usr1, usr2, usr3);
Но выход всегда:
<usr3>, <usr3>, <usr3>
Работает для меня просто отлично http://ideone.com/wag014 –
'free (parsedData);' находится в правильном месте в коде. Это удобно, если вы поймаете этот возвращенный буфер. –
Вы не должны касаться глобальной переменной этой функции. Просто верните значение локальной переменной указателя (выделенная память находится в куче, поэтому перейдет в область действия). На самом деле вы, вероятно, не должны иметь глобальную переменную вообще, но дело в том, что нести ответственность за то, чтобы ухаживать за указателем на вызывающего. – hyde