Здравствуйте, помогите пожалуйста со строковыми массивами, никак не могу разобраться.
Есть одномерный массив text[...], в который пользователь заносит строку символов (у меня это с помощью gets, чтобы пробелы читались) . Мне же нужно преобразовать его в двумерный массив a[...][...], в котором строка будет обозначать номер слова, а столбец - номер символа. По идее принцип прост: цикл по i с условием text[k]!='\0' (пока не дойдем до конца строки) , внутри него вложенный цикл по j с присваиванием a[j]=text[k] с условием пока text[k]!=' ' (пока не натыкаемся на пробел) . То есть переписываем из text в a, наткнулись на пробел - перешли на новую строку, наткнулись на нулевой символ (\0) - все циклы завершены. И вроде все здорово, но есть одно НО - у меня это не работает =( То есть ввожу строку, если надо, я могу ее вывести puts'ом еще раз, но как только переходит управление к этим двум циклам, все стопорится и дальше не идет. Вот код:
puts("Vvedite text: \n");
gets(text);
k=0;
int str=0;
int sto=0;
i=0;
j=0;
//Obrabotka teksta (perevod v massiv)
for(i=0;text[k]!='\0';i++)
{
for(j=0;text[k]!=' ';j++)
{
a[j]=text[k];
k++;
if (sto
Другие языки программирования и технологии
C++. Работа со строковыми массивами.
Половина кода все равно съелась. Юзай pastebin.com
Единственное что могу предположить - нужно внимательно следить за тем, чтобы k правильно увеличивалось когда мы стоим на пробеле.
И не забывать завершать строки в полученном массиве нулем.
Можешь пройтись дебагером и посмотреть что происходит, если совсем не понятно что к чему.
Единственное что могу предположить - нужно внимательно следить за тем, чтобы k правильно увеличивалось когда мы стоим на пробеле.
И не забывать завершать строки в полученном массиве нулем.
Можешь пройтись дебагером и посмотреть что происходит, если совсем не понятно что к чему.
#include <iostream>
using namespace std;
struct rowcol { size_t row; size_t col; };
typedef struct rowcol ROWCOL;
bool rowscols(ROWCOL &, const char *);
void showmatrix(char **, size_t);
int main() {
const size_t size = 64;
size_t it = 0;
char text[size];
cout << "Text?.. ";
fgets(text, size, stdin);
ROWCOL rc;
if (rowscols(rc, text)) {
char ** words = new char * [rc.row];
for (size_t r = 0; r < rc.row; r++) {
words[r] = new char [rc.col];
for (size_t c = 0; c < rc.col; c++) {
if (isspace(text[it++])) {
words[r][c] = 0;
while (isspace(text[it++]));
--it; break;
} else words[r][c] = text[it - 1];
}
}
showmatrix(words, rc.row);
for (size_t r = 0; r < rc.row; r++) delete[] words[r];
delete[] words;
} else cout << "\a Error!\n";
cin.get(); cin.get();
return 0;
}
void showmatrix(char ** _matrix, size_t _rows) {
size_t r, c;
for (r = 0; r < _rows; r++, cout << endl) for (c = 0; int(_matrix[r][c]); c++) cout << _matrix[r][c];
}
bool rowscols(ROWCOL & _rc, const char * _arr) {
size_t n = 0, row = 0, col = 0, count = 0;
bool words = true;
char space = 32;
while (_arr[n] != 0) {
if (_arr[n] != space) ++count;
else if (count > col) col = count;
if (words && _arr[n] != space) {
++row;
words = false;
} else if (_arr[n] == space) {
count = 0;
words = true;
}
++n;
}
if (count > col) col = count;
_rc.row = row;
_rc.col = col;
if (row && col) {
++_rc.col; return true;
}
return false;
}
using namespace std;
struct rowcol { size_t row; size_t col; };
typedef struct rowcol ROWCOL;
bool rowscols(ROWCOL &, const char *);
void showmatrix(char **, size_t);
int main() {
const size_t size = 64;
size_t it = 0;
char text[size];
cout << "Text?.. ";
fgets(text, size, stdin);
ROWCOL rc;
if (rowscols(rc, text)) {
char ** words = new char * [rc.row];
for (size_t r = 0; r < rc.row; r++) {
words[r] = new char [rc.col];
for (size_t c = 0; c < rc.col; c++) {
if (isspace(text[it++])) {
words[r][c] = 0;
while (isspace(text[it++]));
--it; break;
} else words[r][c] = text[it - 1];
}
}
showmatrix(words, rc.row);
for (size_t r = 0; r < rc.row; r++) delete[] words[r];
delete[] words;
} else cout << "\a Error!\n";
cin.get(); cin.get();
return 0;
}
void showmatrix(char ** _matrix, size_t _rows) {
size_t r, c;
for (r = 0; r < _rows; r++, cout << endl) for (c = 0; int(_matrix[r][c]); c++) cout << _matrix[r][c];
}
bool rowscols(ROWCOL & _rc, const char * _arr) {
size_t n = 0, row = 0, col = 0, count = 0;
bool words = true;
char space = 32;
while (_arr[n] != 0) {
if (_arr[n] != space) ++count;
else if (count > col) col = count;
if (words && _arr[n] != space) {
++row;
words = false;
} else if (_arr[n] == space) {
count = 0;
words = true;
}
++n;
}
if (count > col) col = count;
_rc.row = row;
_rc.col = col;
if (row && col) {
++_rc.col; return true;
}
return false;
}
Похожие вопросы
- Задача на C++ по одномерным (статическим) массивам, помогите сделать, пожалуйста, очень надо на завтра
- Написать программу работы с одномерным массивом из 15 вещественных элементов для решения задач:
- Каким образом в c++ можно передать двумерный массив в фунцкию?
- C почему у меня массив на 4 символа, а я ввожу 10 например, и он потом выводит 10 из этого массива, вот мой код:
- Количество максимальных (C++) как решить без массивов?
- C# программа с байтами, массивами и циклами
- Помогите пожалуйста написать программу на c++. Упорядочить элементы одномерного массива по убыванию.
- c# Подскажите что такое массив?
- C# работа с браузером
- C++. Работа с символьными данными. Напишите пожалуйста
int r,j,num,k=0,str=0,sto=0;
char text[255],a[30][255];
int main()
{
//clrscr();
puts("Vvedite tekst bukvami odnogo registra (stro4nie libo propisnie): \n");
gets(text);
cout
Вот, а то съедается код.