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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> строка с разделителем в массив 
:(
    Опции темы
Temdegon
Дата 3.1.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я слабо знаком с си. Очень нужно написать код, который бы преобразовывал строку с подстроками разделенными ';' в массив строк. Я очень долго "рожал" этот код, и по моему получилось ужасно:


Код

                        char* strings[10];
        char *str = "aaa;bb;cccc;z";
        int prev = 0;
        int current = -1;
        char  buf[10]; 
        
        memset(buf, 0, sizeof(buf)); 
        int z =strlen(str);
        int cnt = 0;
        for (i = 0; i < z; i++){
            if (str[i] == ';'){
                prev = current;
                current = i;
                strncpy(buf, str+prev+1, current-prev-1);
                strings[cnt] = buf;
                memset(buf, 0, sizeof(buf)); 
                cnt++;
            }
        }
        strncpy(buf, str+current, strlen(str)-prev);
        strings[cnt] = buf;


Код, по-моему ужасен, к тому же, у меня не получается сделать так, чтобы небыло пустых элементов массива. Помогите пожалуйста, мне кажется что для опытного программиста это дело на одну минуту.

PM MAIL   Вверх
Hades
Дата 3.1.2009, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 8.8.2008

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



Код

char* strings[10];
int currentStr = 0;
char *str = "aaa;bb;cccc;z";
int i;

char *ptr = strtok(str, ";");

while(ptr) {
    strings[currentStr] = new char[strlen(ptr)+1];
    strcpy(strings[currentStr], ptr);
    ++currentStr;
    ptr = strtok(NULL, ";");
}

for (i = 0; i < currentStr; ++i)
    cout << strings[i] << endl;

for (i = 0; i < currentStr; ++i)
    delete [] strings[i];

PM MAIL   Вверх
Rififi
Дата 3.1.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 3
Всего: 36



Temdegon, 
можно воспользоваться библиотечной функцией strtok
при этом  следует учесть что strtok изменяет переданную её строку, поэтому передавать туда str, обьявленный как char* - неправильно, ибо данные, на которые указывает str расположены в read-only памяти. По уму, эта строка должна выдавать ошибку компиляции, но ради совместимости со старым г###окодом такая запись допустима.

Код
char str[] = "aaa;bb;cccc;z";
const char* delims = ";"; // список разделителей

// массив, куда будут складываться токены
char* tokens[10] = { NULL };
char** p = tokens;

char* tok = strtok(str, delims);
if (tok == NULL)
    return; // в случае если разделителей не обнаружено, больше делать нечего

do 
{
    *p++ = tok;
} while ((tok = strtok(NULL, delims)) != NULL); // можно подсократить до while (tok = strtok(NULL, delims)); если не аннонят варнинги


Это сообщение отредактировал(а) Rififi - 3.1.2009, 23:41
PM MAIL   Вверх
Temdegon
Дата 3.1.2009, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Большое спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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