2016-02-11 5 views
1

Я пытаюсь создать метод, который берет строку и массив и разбивает строку на массив строк с помощью strtok(). Я предполагаю, что данный массив имеет достаточно места, и разбиение выполняется, когда в массиве есть пространство. Я думаю, что это почти правильно, я просто нужен последний толчок :) Вот мой код атм:C splitting string to stringarray

string_to_stringarray(char* string, char** array) { 

    int i = 0; 
    array[i] = strtok(string, " "); 

    while (array != NULL) { 
     array[i++] = strtok(NULL, " "); 
    } 
} 
+1

хорошо я буду делать, что – Duzzz

+3

C не поддерживает _methods_, только _functions_. – Olaf

+0

Сама функция плохо разработана. Вероятно, вы должны добавить параметр максимального размера, чтобы массив не мог переполняться, и вы также должны сообщать вызывающей функции, сколько токенов найдено. Это можно сделать, вернув счет или добавив в ваш массив «NULL» дозор, или и то, и другое. –

ответ

2

Условие while не имеет никакого смысла. Значение array не изменяется в функции, поэтому цикл бесконечен (если только array не является NULL с начала, и в этом случае первое присваивание array[0] вызывает неопределенное поведение).

Это должно быть что-то вроде:

size_t split_string(char *string, char **array) { 
    size_t i = 0; 

    char *token = strtok(string, " "); 
    while (token != NULL) 
    { 
    array[i++] = token; 
    token = strtok(NULL, " "); 
    } 
    return i; 
} 

Это возвращает количество строк, найденных и меняет имя, так как код пользователя не может определить функции, начиная с str.

+0

В то же время необходимо получить каждый из токенов после первого. Проблема заключается в условии while, которое должно быть массивом [i], а не массивом. –

+0

@JeffAllen Я, конечно, не спрашивал об использовании цикла. :) – unwind

+0

@JeffAllen Это были ошибки, спасибо большое. Иногда вам нужен другой человек, чтобы найти очевидное :) – Duzzz

0

условие в то время как заявление

while (array != NULL) { 
     ^^^^^^^^^^^^^ 

неправильно, так как массив, как это следует из вашего поста уже выделен.

Функция может выглядеть

void string_to_stringarray(char *string, char **array) 
{ 
    int i = 0; 

    array[i] = strtok(string, " "); 

    while (array[i] != NULL) array[++i] = strtok(NULL, " "); 
            ^^^ 
} 
+0

Да, это тоже заметили. Я думаю, что пришло время спать, так как я пропускаю очевидное :) – Duzzz

0

Я сделал что-то подобное с оболочкой я по существу закончил здание в C++, за исключением того, я использовал вектор в очереди вместо массива. Возможно, вы можете отскочить от моего алгоритма, который я уже доказал, что работаю.

int i = inputString.find_first_not_of(" "); 
    int j = inputString.find_last_not_of(" \n\r"); 
    int k; 
    string stringToAdd; 

    while (i != -1) { 
      k = i; 

      while (inputString.at(k) != ' ') { 

        if (k == j) { 
          break; 
        }; 

        k++; 
      }; 

      if (k != j) { 
        k--; 
      }; 

      stringToAdd = inputString.substr(i, k - i + 1); 
      i = inputString.find_first_not_of(" ", k + 1); 
      commandQueue.push_back(stringToAdd); 
    }; 
0

Таким образом, решение было очевидно, я пропустил [i] во время цикла. Правильная линия является

while (array[i] != NULL){ 

Спасибо за быстрые ответы :) Идя спать теперь, так как я не делаю никакого прогресса лол

+0

Я не думаю, что это будет очень хорошо, так как вы также выполняете 'i ++' внутри цикла. Мой ответ, честно говоря, лучше. – unwind

+1

Спокойной ночи. Когда вы вернетесь к своей проблеме завтра утром, вы обнаружите, что ваше решение теперь проглочивает первый токен, потому что он перезаписывает 'array [0]'. Предлагаемое решение @unwind не имеет этой проблемы: он присваивает массив, увеличивает счетчик (и в надежной функции также проверяет переполнение) только в одном месте. –