2015-12-11 2 views
1

Когда я пытаюсь скопировать массивы в неровный массив. Моя цель - взять массив типа char, разделить «слова» на отдельные массивы (я использую уже действующую функцию для него) и хочу поместить их в массив.Как скопировать массив в зубчатый массив

static char[][] split_string(char[] str) 
{ 
    int length = count_words(str); 
    char[][] sentence = new char[length][]; 
    int start = 0; 
    int end = 0; 
    int word = 0; 
    int i = -1; 
    while (i != str.Length) 
    { 
    i++; 
    if (str[i]==' ') 
    { 
     end = i-1; 
     char[] aux_array = substring(str, start, end); 
     //issue 
     aux_array.CopyTo(sentence[word], 0); 
     //alternative (not working either) 
     /* 
     for(int j=0; j<aux_array.Length;j++) 
     { 
     sentence[word][j] = aux_array[j]; 
     } 
     */ 
     while (str[i]==' ') 
     { 
     i++; 
     } 
     word++; 
     start = i; 
    } 
    } 
    return sentence; 
    } 

Для получения дополнительной информации,
подстроки, если формы: подстроки (массив, Int, Int) -> массив count_word имеет вид: count_word (массив) -> Int

+0

Hi Bazin, добро пожаловать в SO. Чтобы помочь другим помочь вам, укажите, какие проблемы вы столкнулись с вашим кодом? Что вы ожидали, и что делает ваш код на самом деле? Пожалуйста, прочитайте [ask] и [mcve]. –

+0

См. [«Если вопросы включают« теги »в их названиях?»] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), где консенсус «нет, они не должны»! –

ответ

2

Мои Цель состоит в том, чтобы взять массив типа char, отделить «слова» от отдельных массивов (я использую уже действующую функцию для него) и хочу поместить их в массив.

Тогда просто поместить их в массив

//... 
sentence[word] = substring(str, start, end); 

Обратите внимание, что зазубренные элементы массива являются null по умолчанию, и вы не выделяли их, так что вы, вероятно, получаете нулевое эталонное исключение. Если вам действительно нужно сделать копию возвращенного массива, то самый простой способ заключается в использовании Array.Clone метод как этот

sentence[word] = (char[])substring(str, start, end).Clone(); 
+0

кажется, что он работает, но теперь я получаю исключение «вне диапазона» в «if (str [i] == '')» после того, как я попытаюсь запустить его – Wipoulou

+0

@ LoïcBazin Ну, это еще одна проблема в вашем коде, который не связан на исходный вопрос. Вы можете исправить это, используя 'while (i

0

Это легче работать со строками, а не сырые массивы символов, но я предполагаю, что это с намерением что вы решили использовать массивы символов.

Одним из способов упрощения вашего кода является создание массива символов, когда вы идете, а не выделяете его. .NET массивы имеют фиксированный размер, но List<T> позволяет вам выращивать коллекцию предметов.

Вы также можете изменить свою функцию в блок итератора, чтобы упростить ее дальнейшее. Когда слово будет завершено, вы получите yield return его вызывающему.

IEnumerable<char[]> SplitString(char[] str) { 
    var word = new List<char>(); 
    foreach (var ch in str) { 
    if (ch == ' ') { 
     if (word.Count > 0) { 
     yield return word.ToArray(); 
     word = new List<char>(); 
     } 
    } 
    else 
     word.Add(ch); 
    } 
    if (word.Count > 0) 
    yield return word.ToArray(); 
} 

Эта функция не возвращает массив, так что если вы хотите, массив массивов (зазубренный массив), необходимо использовать ToArray():

var str = "The quick brown fox jumps over the lazy dog".ToCharArray(); 
var result = SplitString(str).ToArray(); 

Этот код будет корректно обрабатывать несколько пробелов и пробелов в начало и конец строки источника.