Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Sammi2186
1 / 1 / 0
Регистрация: 17.09.2013
Сообщений: 99
1

Инициализация беззнаковых массивов

19.09.2013, 16:04. Просмотров 737. Ответов 13
Метки нет (Все метки)

Здравствуйте, появилась необходимость в массиве символов неопределенного размера. На лекции в институте сказали, что можно так: std[]. Сказали, что массив зарезервирует столько позиций, сколько необходимо. Но компилятор выдает ошибку: error C2133: 'str1' : unknown size. Как исправить?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2013, 16:04
Ответы с готовыми решениями:

Инициализация массивов указателей
Как сделать так, что бы элементы(указатели) массива указателей можно было...

Перевод беззнаковых чисел из двоичной с-мы в десятичную
Доброго времени суток. Написал такое чудо для перевода из двоичной в...

В каждом из массивов найти наименьшее значение и прибавить его ко всем элементам массивов
Заданы два массива А(M) и В(M). В каждом из массивов найти наименьшее значение...

Алгоритмы сортировки массивов.Реализуйте алгоритмы сортировок данных массивов
Задания к лабораторной работе. Выполните приведенные ниже задания. 1. Даны...

Инициализация переменной
Привет, как сделать чтобы переменной присваивалось значение если я ничего не...

13
fanatdebian
Z3JheSBoYXQ=
339 / 234 / 83
Регистрация: 08.07.2012
Сообщений: 577
19.09.2013, 16:16 2
Цитата Сообщение от Sammi2186 Посмотреть сообщение
Здравствуйте, появилась необходимость в массиве символов неопределенного размера. На лекции в институте сказали, что можно так: std[]. Сказали, что массив зарезервирует столько позиций, сколько необходимо. Но компилятор выдает ошибку: error C2133: 'str1' : unknown size. Как исправить?
Вы там в институте какой язык изучаете? ++ или чистый си?
На чистом си неопределенный динамический массив по факту равен пустому указателю определенного типа.
C
1
int *array  = NULL;
Далее ты выделяешь память в зависимости от условий решения поставленной задачи. И да, ты спроси себя, как компилятор может знать, сколько резервировать памяти, если первичное значение неопределенно. А ежели значение известно, тогда зачем квадратное колесо, используй статический массив.
1
Algoritmer
155 / 95 / 24
Регистрация: 07.03.2013
Сообщений: 490
Записей в блоге: 1
19.09.2013, 16:34 3
Вот пример работы с массивом неопределенного размера
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void main()
{
   cout<<"Input array size: ";
   int a;
   cin>>a;
   int *mass=new int[a]; //объявляем и создаем массив длины, указанной пользователем
   cout<<"Input array :\n ";
   for(int i=0;i<a;i++)
   {
      cout<<(i+1)<<" element: ";
      cin>>mass[i];
   }   
}
Длина массива неопределена на этапе компиляции но известна при исполнении кода. Такой массив называется динамическим
1
Sammi2186
1 / 1 / 0
Регистрация: 17.09.2013
Сообщений: 99
19.09.2013, 18:13  [ТС] 4
Чистый Си изучаем пока.
Видите ли, у меня задача такая: пользователю предлагается ввести строку, он вводит, он же не будет считать, сколько символов введет. Далее с этой строкой происходят дальнейшие действия. Вообще допустимо не более, чем 256 символов в строке, но если введется больше, то необходимо вывести соответствующее сообщение и завершить программу.
0
Algoritmer
155 / 95 / 24
Регистрация: 07.03.2013
Сообщений: 490
Записей в блоге: 1
20.09.2013, 11:10 5
Цитата Сообщение от Sammi2186 Посмотреть сообщение
Чистый Си изучаем пока.
Видите ли, у меня задача такая: пользователю предлагается ввести строку, он вводит, он же не будет считать, сколько символов введет. Далее с этой строкой происходят дальнейшие действия. Вообще допустимо не более, чем 256 символов в строке, но если введется больше, то необходимо вывести соответствующее сообщение и завершить программу.
Приведенный мной код написан на чистом Си. А то что, пользователь не будет вводить длину строки, это да. Но всё равно, чтобы создать массив, нужно знать его размер хотя бы на этапе исполнения, а значит нужно этот размер как-то определить. Предлагаю так, а там сами смотрите:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
include <iostream>
using namespace std;
void main()
{
   cout<<"Input string: ";
   char *s= new char[256];  //строка максимальной длины (потом удалим)
   cin>>s;
   int len=strlen(s); //определяем реальную длину введенной строки
   char *str2=new char[len+1]; //строка нужного размера
   strncpy(str2,s,len); //копируем из s в str2 len-символов
   str2[len]=0; //символ конца строки влепим на всякий случай, т.к. помниться мне что strncpy сама его не дописывает
   delete []s; //удаляем нашу длинную строку (освобождаем память)
   // дальше продолжаем работать со строкой нужного нам размера, т.е. с str2
    
}
1
easybudda
Модератор
Эксперт CЭксперт С++
10154 / 6059 / 1524
Регистрация: 25.07.2009
Сообщений: 11,484
20.09.2013, 15:32 6
Цитата Сообщение от Algoritmer Посмотреть сообщение
Приведенный мной код написан на чистом Си.
Да ну? Это с каких пор в языке С cin/cout появились вкупе с заголовком <iostream> и оператором new?
1
Algoritmer
155 / 95 / 24
Регистрация: 07.03.2013
Сообщений: 490
Записей в блоге: 1
20.09.2013, 15:44 7
Цитата Сообщение от easybudda Посмотреть сообщение
Да ну? Это с каких пор в языке С cin/cout появились вкупе с заголовком <iostream> и оператором new?
Ты думаешь, что Sammi2186 настолько чистый Си изучает? Боюсь что Си без cin/cout даже преподы не знают
0
easybudda
Модератор
Эксперт CЭксперт С++
10154 / 6059 / 1524
Регистрация: 25.07.2009
Сообщений: 11,484
20.09.2013, 15:48 8
Цитата Сообщение от Algoritmer Посмотреть сообщение
Ты думаешь, что Sammi2186 настолько чистый Си изучает?
Я думаю, что не нужно человека в заблуждение вводить. К тому же это правила форума нарушает (п. 5.21).
0
Algoritmer
155 / 95 / 24
Регистрация: 07.03.2013
Сообщений: 490
Записей в блоге: 1
20.09.2013, 15:52 9
easybudda, хорошо. Если убрать из моего кода cin, то это будет чистый С? И вообще, что тогда это за загадочный язык такой, чистый С?
0
easybudda
Модератор
Эксперт CЭксперт С++
10154 / 6059 / 1524
Регистрация: 25.07.2009
Сообщений: 11,484
20.09.2013, 15:57 10
Цитата Сообщение от Algoritmer Посмотреть сообщение
Если убрать из моего кода cin, то это будет чистый С?
Нет.
Цитата Сообщение от Algoritmer Посмотреть сообщение
И вообще, что тогда это за загадочный язык такой, чистый С?
Видимо, тот, который описан соответствующим стандартом. Почитайте на досуге
0
Algoritmer
155 / 95 / 24
Регистрация: 07.03.2013
Сообщений: 490
Записей в блоге: 1
20.09.2013, 16:09 11
easybudda, ладно верю. Так много читать лень. Если вкратце, можете всё-таки сказать какие именно строки не соответствуют стандарту С?
0
easybudda
Модератор
Эксперт CЭксперт С++
10154 / 6059 / 1524
Регистрация: 25.07.2009
Сообщений: 11,484
20.09.2013, 16:29 12
Начиная с самой первой.
C
1
2
3
4
int main(void) {
    /*...*/
    return SOME_EXIT_CODE;
}
или
C
1
2
3
4
int main(int argc, char ** argv) {
    /*...*/
    return SOME_EXIT_CODE;
}
При чём стандарту ANSI C 89 (тому самому, который можно сказать поддерживает компилятор из мелкостудии) вообще ни одна строчка не соответствует...
0
Sammi2186
1 / 1 / 0
Регистрация: 17.09.2013
Сообщений: 99
20.09.2013, 19:16  [ТС] 13
Цитата Сообщение от Algoritmer Посмотреть сообщение
Ты думаешь, что Sammi2186 настолько чистый Си изучает? Боюсь что Си без cin/cout даже преподы не знают
Чистый Си изучаем. С printf и scanf) Нет cin и cout. Сказали, по Си быстро пробежимся, а потом на ++ перейдем.

Добавлено через 4 минуты
Цитата Сообщение от Algoritmer Посмотреть сообщение
Приведенный мной код написан на чистом Си. А то что, пользователь не будет вводить длину строки, это да. Но всё равно, чтобы создать массив, нужно знать его размер хотя бы на этапе исполнения, а значит нужно этот размер как-то определить. Предлагаю так, а там сами смотрите:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
include <iostream>
using namespace std;
void main()
{
   cout<<"Input string: ";
   char *s= new char[256];  //строка максимальной длины (потом удалим)
   cin>>s;
   int len=strlen(s); //определяем реальную длину введенной строки
   char *str2=new char[len+1]; //строка нужного размера
   strncpy(str2,s,len); //копируем из s в str2 len-символов
   str2[len]=0; //символ конца строки влепим на всякий случай, т.к. помниться мне что strncpy сама его не дописывает
   delete []s; //удаляем нашу длинную строку (освобождаем память)
   // дальше продолжаем работать со строкой нужного нам размера, т.е. с str2
    
}
Спасибо, попробуй ваш способ)
0
Qwertiy
821 / 629 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
20.09.2013, 19:41 14
Цитата Сообщение от Algoritmer Посмотреть сообщение
Если вкратце, можете всё-таки сказать какие именно строки не соответствуют стандарту С?
1. Нет <iostream>.
2. Нет пространств имён.
3. void main - про стандарт не знаю, но должно компилироваться.
6,8,9. Объявление переменных не в начале блока. Стандарту соответствует, но может не скомпилироваться. В VS не скомпилируется. В Borland CPP 3.1 - тоже.
6,9,12. Нет операторов new и delete, надо использовать malloc и free.
7. Нет перегрузки операторов.
7. Нет cin.

Ещё по поводу этой программы.
- Не обрабатывается вариант воода более чем 256 символов
- Строки 10-11 можно заменить на обычный strcpy.
- Нужно подключать заголовочные файлы. Даже для Си++. Iostream не обязан тянуть за собой string.h, хотя и делает это в VS.

Добавлено через 47 секунд
Кстати, переименуй файлик в .c и скомпилируй

Добавлено через 3 минуты
Цитата Сообщение от Sammi2186 Посмотреть сообщение
На лекции в институте сказали, что можно так: std[]. Сказали, что массив зарезервирует столько позиций, сколько необходимо.
Так будет происходить, если массив сразу инициализируется. В лоюбом случае, размер массива должен быть известен при компиляции программы, а не во время работы. Для создания динамических массивов надо использовать динамическое выделение памяти.
1
20.09.2013, 19:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2013, 19:41

Инициализация строки
Всем привет! Не могу понять, где ошибка( Если я ввожу два символа, например XX,...

Инициализация структуры
Есть такой код: typedef struct Point3DStruct { int x; int y; ...

Безопасная инициализация строки
Здравствуйте. Я разработчик игры на С. В данный момент пишу античит для неё....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru