Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2015, 01:33   #1
Pug_from_Mordor
Пользователь
 
Аватар для Pug_from_Mordor
 
Регистрация: 09.11.2014
Сообщений: 40
Сообщение Функция gets() не хочет читать строку в СИ.

Начал писать программу, в которой нужно ввести строку. Попытался ввести её с помощью функции gets(), а мне показало ошибку:
warning #2018: Undeclared function 'gets'; assuming 'extern' returning 'int'.
Код:
#include<stdio.h>
#include<locale.h>
#include<string.h>

int main(void)
{
   int n; //n-размер массива.

	setlocale(LC_ALL, "RU");
	printf("Введите размер массива: ");
	scanf("%d", &n);
	char a[n];
	printf("Введите все элементы массива:\n");
	gets(a);
	printf("%s", a);

	return 0;
}
Pug_from_Mordor вне форума Ответить с цитированием
Старый 05.01.2015, 04:18   #2
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

char a[n]; должно быть в начале main до использования printf;
размер массива у вас не константа, то есть это ошибочное объявление.
Размер массива должен быть константой, так как этот массив записывается по статическому количеству байт в исполняемый файл, то есть в образ исполняемого файла в памяти. С неизвестным размером массива неконстантным запись в файл невозможна. Архитектура операционной системы такая.
Чтобы выделить под массив неконстантное количество байт нужно использовать динамическое выделение памяти, когда память выделяется из кучи.
Вам нужно хорошо понять, что такое куча, так как в профессиональных программах создается пул из оперативной памяти в виде класса, и из этого пула выделяется необходимое количество байт. Создание кучи на winAPI осуществляется с помощью HeapAlloc. То есть действие с кучей нужно хорошо понимать. Например, в игре STALKER 2007 года реализован особый модуль для обработки кучи.
Кроме того реализуется особый модуль для работы с указателями (т.н. умные указатели). Особый модуль для размера с массивами.

Чтобы динамически выделить память, не создавая специальный профессиональный модуль, нужно использовать функцию malloc языка C, которая на самом деле в windows является оберткой (wrapper) над HeapAlloc. А на языке C++ используется оператор new. Дело в том, что в профессиональных программах, вам может понадобиться больше 16 гигабайт памяти, так как сейчас на некоторых компьютерах может быть 16 и больше гигабайт оперативной памяти, и ее нужно уметь использовать. Так как если в игре множество текстур, каждая из которых по 1 мегабайту, то для тысячи текстур в игре может понадобиться гигабайт оперативной памяти. Освобождение выделенной памяти осуществляется операторами delete иили функцией free языка C.
Пример динамического выделения памяти
char* a = (char*) malloc (n*sizeof(char));
char* b = new[a];
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"

Последний раз редактировалось challengerr; 05.01.2015 в 04:29.
challengerr вне форума Ответить с цитированием
Старый 05.01.2015, 18:59   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

gets(a); - Нельзя ввести сразу весь массив элементов.
Можно ввести элемент массива. Ввод элементов массива выполняется с использованием цикла.
Массив следует описывать в начале программы,с явным указанием размера.
Так понимаю, что до работы с динамической памятью ...

Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция получае на вход строку чисел, выводит строку символов DellOleg Microsoft Office Access 2 18.02.2012 11:17
Читать из файла случайную строку KoBRaAndrey Общие вопросы Delphi 3 28.10.2009 21:38
ActiveX не хочет читать большой файл Miklek Общие вопросы Delphi 0 02.04.2009 11:55
Программный шлюз не хочет читать marain Общие вопросы C/C++ 0 07.01.2009 00:52
DVD-RW дисковод не хочет читать некоторые диски ERASERROR Компьютерное железо 10 02.05.2008 01:00