Как объявить двумерный массив char
Перейти к содержимому

Как объявить двумерный массив char

  • автор:

Можно ли создать символьный двумерный массив char ?

Author24 — интернет-сервис помощи студентам

Можно ли создать символьный двумерный массив char ?
Например char slovo[20][20]; и потом записывать и считывать слова ?

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Создать символьный массив (char-массив) из 10 элементов. Определить сколько в нѐм цифр, букв и знаков пунктуации
Создать символьный массив (char-массив) из 10 элементов. Определить сколько в нѐм цифр, букв.

Символьный массив и указатель на char
Читал уже где-то на форуме тему, где показывалась разница между:char mas="Hello"; char *.

Перевод int в символьный массив char
Помогите плз реализовать алгоритм перевода целого числа в символьный массив.. К примеру: дано.

Можно ли на основе vector’а создать двумерный массив
Доброго времени суток. Собственно, вопрос заключен в самой теме. Возможно ли создать двумерный.

1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461

Лучший ответ

Сообщение было отмечено sergey.shuvalov как решение

Решение

Почему нет-то, конечно же можно:

1 2 3 4 5 6 7 8 9 10
#include int main() { char words[ 20 ][ 20 ] = { "word1", "word2", "word3" }; std::cout  words[ 0 ]  ' '  words[ 1 ]  ' '  words[ 2 ]  std::endl; return 0; }

Arduino.ru

Подключаю клавиатуру.
Некоторые клавиши на клавиатуре должны принтлн несколько букв.
Если я создаю простой массив char с одним символом для каждой клавиши — проблем нет.
но если символов больше одного выдаёт ошибку. Я поставил знак «*» чтобы задать многомерный массив, а он теперь ругается. «invalid conversion from ‘char’ to ‘char*’ [-fpermissive]» Что за ерунда? Что ему нужно? Как задать двумерный массив строк, а не символов?

  • Войдите на сайт для отправки комментариев

Двумерный массив char

Подскажите пожалуйста, как правильно сделать. Мне нужен массив Char Field[20][20] заполненные символами из файла. Я сделал вот такую функцию:

void Spiel::readFile(std::string fileName) < std::ifstream file(fileName.c_str()); if (!file.is_open()) < std::cerr std::string line; int a = 0; while (true) < if (a == 21) break; std::getline(file, line); for (int i = 0; i < 20; i ++) < if (line[i] == std::string::npos) < Field[a][i] = '#'; >else < Field[a][i] = line[i]; >> a++; // weiter machen if, wenn Field [i][j] == "B", bx = i, by = j > std::cerr int main(int argc, char** argv) < Spiel spiel; spiel.readFile(std::string(argv[1])); >; 

По gdb print Field или print line выдает непонятные числа и знаки, но ни как не буквы которые стоят в считываемом файле. Не могу понять что не так

Отслеживать
6,853 2 2 золотых знака 23 23 серебряных знака 43 43 бронзовых знака
задан 10 июл 2016 в 18:28
55 1 1 серебряный знак 5 5 бронзовых знаков
Вы бы воспользовались отладчиком, было бы скорее.
10 июл 2016 в 18:35
каким отладчиком ?
10 июл 2016 в 18:35

Какой-то странный алгоритм заполнения массива. Начиная с while(true) < if(a==21) . . Читая этот мозголомный код сложно уловить суть.

10 июл 2016 в 18:37

@PinkTux замысел был таков, что по строчке все считаются буквы из файла и сохраняются в Field. Переменная а считает количество строк. Когда было сосчитано 20 строк, то break

10 июл 2016 в 18:44
@Владимир: Любым, собственно. Обычно в комплекте с компилятором идёт отладчик.
10 июл 2016 в 18:47

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Один вопрос: что вы подразумевали под этой строкой line[i] == std::string::npos ? Если я правильно понял, если строка короче 20 символов, то вы ее добиваете решетками, я прав?

В целом сразу бросается в глаза, что вы заполняете массив на 20 строк, но читаете вы 21 раз, да и вообще, зачем мучаться с while(true) , если по факту все равно у вас цикл с заранее известным количеством шагов, надо заменить на for .

Теперь, длину строки имеет смысл проверять как i >= line.length() .

В итоге получается примерно так:

void Spiel::readFile(std::string fileName) < std::ifstream file(fileName.c_str()); if (!file.is_open()) < std::cerr std::string line; for(int a = 0; a < 20; a++) < std::getline(file, line); for (int i = 0; i < 20; i ++) < if (i >= line.length()) < Field[a][i] = '#'; >else < Field[a][i] = line[i]; >> > std::cerr

Я проверил этот код на файле с этой самой функцией, получилось так:

#include # #include ### #include ## #################### void readFile(std::s char Field[20][2 std::ifstream fi if (!file.is_ope std::cerr ############### std::string line int a = 0;###### while (true)  

Двумерные массивы в языке Си

На прошлой лабораторной работе вы познакомились с массивами в языке Си и уяснили, что массив это упорядоченный набор элементов некоторого типа. А может ли элемент массива так же являться массивом? В языке Си подобные конструкции называются двумерными массивами или матрицами. Описание двумерного массива строится из описания одномерного путем добавления второй размерности, например:

Анализ подобного описания необходимо проводить в направлении выполнения операций индексирования, то есть слева направо. Таким образом, переменная a является массивом из четырех элементов, что следует из первой части описания a[4]. Каждый элемент a[i] этого массива в свою очередь является массивом из трех элементов типа int, что следует из второй части описания.

Для наглядности двумерный массив можно представить в виде таблицы с числом строк, равным первому размеру массива, и числом столбцов, равным второму размеру массива, например:

Инициализация двумерного массива

Инициализация двумерного массива проводится по строкам, например, для того чтобы получить вышеописанный массив a, можно было бы провести следующую инициализацию:

Здесь первый размер массива будет определен компилятором. Следует отметить, что второй размер массива должен быть всегда указан. Это необходимо для того, чтобы сообщить компилятору размер строки массива, без которого компилятор не может правильно разместить двумерный массив в памяти ЭВМ.

Для инициализации двумерного массива символов можно использовать упрощенный синтаксис инициализации строк:

Размер памяти, заказанный под каждую строку в этом случае должен быть равным длине самой длинной строки с учетом символа завершения строки. При этом, для части строк (строка 1 и строка 3) будет выделено излишнее количество памяти. Таким образом, хранение строк различной длины в двумерном массиве символов недостаточно эффективно с точки зрения использования памяти.

Работа с двумерным массивом

Ввод двумерного массива осуществляется поэлементно с помощью двух вложенных циклов. Следующий фрагмент программы предназначен для ввода по строкам двумерного массива элементов типа int размером n строк на m столбцов:

Считывание и запись ячейки двумерного массива осуществляется при помощи оператора присваивания = и ничем принципиально не отличается от считывания и записи значения переменной:

int d = a[0][0]; - считывание левой верхней ячейки массива в переменную d;

a[n-1][m-1] = 22; - запись в правую нижнюю ячейку массива числа 22.

Вывод такого же двумерного массива иллюстрирует следующий фрагмент:

В данном фрагменте после вывода очередной строки массива осуществляется переход на следующую строку дисплея.

В языке Си допускается использовать не только двумерные, но и трехмерные, четырехмерные и т. д. массивы. Их использование ничем принципиально не отличается от использования двумерных массивов, однако на практике они применяются значительно реже.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *