Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг строки, в двумерный массив 
:(
    Опции темы
POLTER
Дата 11.3.2007, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 25.8.2006
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Здравствуйте!
Начал изучать C, пытаюсь разбить строку типа d=2&c=3&d=4 на элементы массива по разделителю "&".
Код

#include <stdio.h>
#include <stdlib.h>
main() {
  char *query_string = "d=2&c=3&d=4";
  char get[10][50];
  int i, j;
  i = 0;
  while (query_string[i] != '\0') {
    j = 0;
    while (query_string[j] != '&' && query_string[j] != '\0') {
      get[i][j] = query_string[j];
      j++;
    }
    i++;
    query_string += sizeof(char) * (j + 1);
  }
}

Вроде бы все работает как надо, но во всех элементах массива кроме первого после нужного значения идет абракадабра типа (Юы(ЮЙ©©...
Что я делаю не так??
Компилирую через GCC во FreeBSD 6.2.
Спасибо заранее!
--------------------
Существует 10 типов людей: те, которые понимают твоичный код и те, которые его не понимают.
PM MAIL ICQ   Вверх
vinter
Дата 11.3.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Код

 while (query_string[j] != '&' && query_string[j] != '\0') {
      get[i][j] = query_string[j];
      j++;
    }
get[i][j] = '\0';



--------------------
Мой блог
PM MAIL WWW   Вверх
Dov
Дата 11.3.2007, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



вместо 
Код
i++;

напиши 
Код
get[i++][j] = '\0';


Добавлено @ 20:34 
Ой, уже ответили


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
POLTER
Дата 11.3.2007, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 25.8.2006
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Спасибо! smile

Но вот еще вопрос: длина данных может быть разная, как динамически определить размер двумерного массива get? Что-то типа **get?
--------------------
Существует 10 типов людей: те, которые понимают твоичный код и те, которые его не понимают.
PM MAIL ICQ   Вверх
zkv
Дата 11.3.2007, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



POLTER, во первых не размер, а размеры, т.к. массив двумерный, во вторых определить можно (имея только имя массива) только для массива, расположенного в стеке, используя оператор sizeof() (для двумерного там могут лежать грабли, связанные с тем, что в размер будут добавлены размеры указателей на строки, не уверен smile ).

 Но лучше хранить размеры в специально заведенных для этого переменных, вдруг надумаете переделать с динамическим распределением памяти - не придется код перелопачивать, да и понятнее, нагляднее код будет. 

Кстати, **get к вопросу никакого отношения не имеет, в вашей проге это будет значение первого элемента в массиве, те get[0][0], да и имя для массива, по моему, крайне неудачное. 

И еще, на всякий случай smile, для строки типа char * размер возвращается функцией strlen()

Это сообщение отредактировал(а) zkv - 11.3.2007, 21:47
PM MAIL   Вверх
Dov
Дата 12.3.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(POLTER @  11.3.2007,  19:35 Найти цитируемый пост)
Но вот еще вопрос: длина данных может быть разная, как динамически определить размер двумерного массива get? Что-то типа **get?

Вот, как пример сойдёт, я так думаю. 
Код
int main(void)
{
    char*  query_string = "d=2&c=3&d=4";
    char** get          = NULL;
    char*  p            = query_string;    
    int    len; 
    int    i = 0,
           j;
     
    while(*p)
    {      
        get = (char**)realloc(get, sizeof(char*) * (i + 1));
           
        while(*p && *p != '&')        
            p++;
                       
        len    = p - query_string + 1;        
        get[i] = (char*)malloc(sizeof(char) * len);
        
        strncpy(get[i], query_string, len);
        get[i++][len - 1] = '\0';
        
        if(*p)        
            query_string = ++p;    
    }
   
    for(j = 0; j < i; j++)
        printf("%s\n", get[j]);
        
    for(j = 0; j < i; j++)
        free(get[j]);
    free(get);    

    return 0;
}




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
POLTER
Дата 12.3.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 25.8.2006
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Dov спасибо большое за примерчик! smile
Сейчас разбираюсь что к чему)
zkv, ясно, спасибо smile
--------------------
Существует 10 типов людей: те, которые понимают твоичный код и те, которые его не понимают.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0866 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.