LINUX.ORG.RU

[ C ] парсинг строки


0

1

есть файл, в котором содержутся данные в виде:

params_1=«value1»;

params_2=«value2»;

.

.

.

params_N=«valueN»;

как правильно распарсить строку и вытащить value из кавычек в соответствуищий массив char для данной переменной(которые в оперативной памяти, а не в файле)

я делаю следующим образом:

1. открываю файл

2. вычитываю из файла строки, которые начинаются с «params_»

#define BUFF_SIZE 32

char str[BUFF_SIZE];

unsigned int i = 0;

while( fgets(str, BUFF_SIZE, pFILE) )

{

str[strlen(str) - 1] = '\0';

if( strstr( &str[0], «params_» ) == &str[0] )

{

printf(«%d: %s», i++, str);

}

}

в цикле нахожу строки, которые мне нужны.

мне нужно распарсить саму строку, т.е. «вытащить» имя переменной и ее значение без кавычек.

прошу помочь, спасибо!



Последнее исправление: Cinewer (всего исправлений: 2)

Ответ на: комментарий от anonymous

(в цикле вызывалаксь strtok а между вызовами был еще один цикл тоже юзающий strtok так вот при выходе из внутреннего цикла внешний оказывался неработоспособен)

Во внутреннем цикле тоже надо было делать strdup и работать с копией токена.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

да не там проблема именно то что TLS хранилище перезаписывается этим же потоком но вложенным циклом ну вот пример запусти у себя и скажи номально ли отработал

int main()
{
  char str1[]="onexxonexxonexxonexxonexxonexx";
  char str2[]="twoxxtwoxxtwoxxtwoxxtwoxxtwoxx";
  char *p;
  if (p = strtok(str1, "xx"))
  {
    do
    {
      puts(p);

#if 0 
 
      if (p = strtok(str2, "xx"))
      {
        do
        {
          puts(p);
        } while (p = strtok(0, "xx"));
      }

#endif

    } while (p = strtok(0, "xx"));
  }
}
вот тут проблему отчетливо видно если в цикле дергать неизвестную функцию то можно ловить глюки страшенные (так как она может тоже юзать strtok)

anonymous
()
Ответ на: комментарий от anonymous

Читаем внимательно мануал и видим, что есть реентерабельный вариант:

cat 1.c 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
  char str[]="one=a=b;two=x=c three=ss=sa=dassd; four=1=2=3=4   five=8;  six";
  char *p, *x, *str1, *sv1, *sv2;
  if (p = strtok_r(str, "; \n", &sv1)){
    do{
      printf("token: %s, subtokens:\n",p);
      str1 = strdup(p);
      if (x = strtok_r(str1, "=", &sv2)){
        do
          printf("\t%s\n",x);
        while (x = strtok_r(0, "=", &sv2));
      }
      free(str1);
    } while (p = strtok_r(0, "; \n", &sv1));
  }
}
gcc 1.c && ./a.out 
token: one=a=b, subtokens:
	one
	a
	b
token: two=x=c, subtokens:
	two
	x
	c
token: three=ss=sa=dassd, subtokens:
	three
	ss
	sa
	dassd
token: four=1=2=3=4, subtokens:
	four
	1
	2
	3
	4
token: five=8, subtokens:
	five
	8
token: six, subtokens:
	six

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

а что у тебя такой ужасный кака стиль ? строки надо хоть как то разделять логически на блоки ну и отступы делать

anonymous
()
Ответ на: комментарий от anonymous

Это не мой стиль, а чуть исправленный пример анонимуса.

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.