2014-11-21 4 views
-2

Поэтому мне нужно превратить c-строку символов (букв и пробелов) в двумерный массив c-строк. Каждая «строка» 2D-массива должна состоять из букв и только букв. По сути, мне нужно взять слова предложения и сделать из них массив.Скопировать слова из c-строки в 2D-массив c-строк

Например: «Я расстроен тем, что на нове мой брендновый bmw lis был украден» должен быть превращен в массив 2d c-string, такой как: «im», «upset», «that», «on», «nov », "е", "мой", "совершенно новый,", "БМВ", "лис", "были", "украден". (Обратите внимание, что есть два пробела между «е» и «мой» & «мой» и «совершенно новый,»)

Следующий код дает мне какой-нибудь интересный вывод в моей консоли ...

char document[201] = "im upset that on nov th my brandnew bmw lis were stolen"; 

char documentArray[13][201]; 

for (int i, k, j = 0;document[k] != '\0';) 
{ 
    if (isspace(document[k])) 
    { 
     cout << "found a space" << endl; 
     k++; 
     while (isspace(document[k])) 
     { 
      k++; 
     } 
     i++; 
     j = 0; 
    } 
    if (isalpha(document[k])) 
    { 
     documentArray[i][j] = document[k]; 
     k++; 
     j++; 
    } 
} 

for (int i = 0; i < maxWords +1; i++) 
{ 
    cout << documentArray[i] << endl; 
} 

Полученный результат имеет в себе какие-то странные вещи. Я не знаю, что это значит (если бы вы могли сказать мне, что это было бы потрясающе). Не могли бы вы помочь мне решить эту проблему?

Вот консольный вывод:

im\203\377 
upset 
that 
on 
nov 
th 
my\3261 
brandnew 
bmw_\377 
lis 
were 
stolen\301$r\377 
\377 
+2

'k' не инициализирован,' document [k]! = '\ 0'' является неопределенным поведением. – AlexD

+0

Вы правы. k явно не инициализируется. Я считаю, что он должен по умолчанию 0 (возможно, не надежно, хотя), тем более, что вывод, похоже, указывает на то, что он работает. – Sam

+0

documentArray также должен быть инициализирован. –

ответ

0

после строки с j++; вставить следующий

if (j < 201) { 
    documentArray[i][j+1] = '\0'; # terminate the c string 
} else { 
    documentArray[i][j] = '\0'; # cannot terminate the c string, overwrite the last char to terminate the string 
} 

Но, пожалуйста, убедитесь, что каждый читать и писать операции НИКОГДА не превышает размеры массива.

Пределы массива - documentArray [0,12] [0,200]. ВСЕГДА проверяйте это. =>http://en.wikipedia.org/wiki/Buffer_overflow

+0

Этот вопрос был для определенной части проекта, поэтому инициализатор documentArray [13] [201] был преднамеренным, но большое вам спасибо! –

+0

Запись за пределы размеров вашего массива может изменять ваш код, изменять переменные, делать прыжки где-то в вашей программе. ;) –

0

Попробуйте добавить завершающий нулевой символ конца ваших строк C при копировании в 2D массив.

В строке C представлены массивы символов, заканчивающиеся символом '\ 0'. Странные коды, которые вы видите, скорее всего, являются результатом отсутствия «\ 0» и окончания печати конца массива символов.

Смежные вопросы