Уважаемый Simps,
У Вас есть как минимум одна ошибка в коде.
Кроме того он не эффективен: Вы выделяете динамическую память там где не надо, а это дорогостоящая операция.
Я тут набросал примерный код (если конечно я правильно понял Вашу цель)
char *getvalue( const char *p_line )
{
char *p_res = NULL;
if ( p_line ) {
p_res = strchr( p_line, '=' );
if ( p_res && *(p_res + 1) ) p_res++;
else p_res = NULL;
}
return p_res;
}
void processing( const char *s )
{
char *v;
if ( !s ) fprintf( stderr, "Pair string is NULL!!!\n" );
else {
v = getvalue( s );
if ( !v )
fprintf( stderr, "ERROR: Wrong pair!!! [%s]\n", s );
else
fprintf( stdout, "Good pair [%s]; value is [%s]\n", s, v );
}
}
/*== test == */
char *pairs[] = {
"",
"2 not equal",
"=",
"p0 =",
"p1= bbb bbb bbbb ",
"p2=[sssssss ssssssssss ssssssssssss]",
NULL
};
char **p = (char **)pairs;
while ( *p ) processing( *p++ );
Что тут важно:
1 нет копирований
2 нет выделения освобождения памяти
3 нет изменения исходных данных
4 получение значения вынесено отдельно от диагностики, специфичной для данной программы, что означает, что getvalue может быть использована позже в других приложениях
5 Для печати ошибок и сообщения об успехе использутся stderr и stdout. Как Вы наверное знаете stderr не буферизируется, что безусловно важно при аварийном завершении программы. В случае с stdout есть вероятность что часть информации так и не будет выведена на терминал
Удачи
--- sas
ЗЫ код не тестирован и тоже может быть с ошибками :O)
>>>А если с комментариями ... ?
>>
>>Sorry for English. Russian version tomorrow.
>>
>>It was my fault anyway, and it's me to clear the things
>>up.
>>
>>>>>>char *per;
>>>>>>per=(char *)malloc(500);
>>...
>>>>>> if ( ( per=strsep(&curline,"\"") ) != NULL )
>>
>>Now 'per' points somewhere into a curline. An allocated value is gone.
>>Freeing 'per' is _wrong_.
>>
>>Did you really wanted to allocate it?
>
>Я прошу прощения, просто у меня свой алгоритм работы =) Я пишу
>пост на опеннет и не дожидаясь ответа рою сам. Так же
>получилось и в этом случае =) На момент ваших ответов я
>уже перечитав кучу док и манов пришел к правильному решению. Вот
>мой окончательный вариант моей функции
>
>char* getcharvalue(curline)
>char *curline;
>{
>
> char *tmpstr;
> char *tmpbuf;
> if ( *(curline) == NULL ) {
>
> printf("ERROR: getcharvalue() - empty
>input\n");
> return(NULL);
> }
> if ( ( tmpbuf = strdup(curline) ) ==
>NULL ) {
> printf("ERROR: getcharvalue() - strdup()
>memory error\n");
> return(NULL);
> }
> tmpstr=strsep(&curline,"=");
> tmpstr=strsep(&curline,"\0");
> if ( *(tmpstr) == NULL ) {
>
> printf("ERROR: Check config file!
>getcharvalue() - empty field after '=', original string \"%s\"\n",
> tmpbuf);
> free(tmpbuf);
> return(NULL);
> }
> free(tmpbuf);
> return(tmpstr);
>
>}
>
>Буду рад услышать коменты