Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Хочу научиться программировать в Linux :)  (Прочитано 30594 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Zenit084

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Re: Хочу научиться программировать в Linux :)
« Ответ #120 : 14 Марта 2009, 00:01:13 »
Почему вот этот код не вводит строку?
(Нажмите, чтобы показать/скрыть)
Если убрать switch, то всё нормально. Раньше в винде писал, всё окей было, а тут не могу понять, в чём проблема. Если использовать scanf, то всё окей, но во-первых мне надо ввести строку, во-вторых хочется понять суть проблемы.
« Последнее редактирование: 14 Марта 2009, 01:03:58 от Zenit084 »

Оффлайн Saha

  • Активист
  • *
  • Сообщений: 517
    • Просмотр профиля
Re: Хочу научиться программировать в Linux :)
« Ответ #121 : 14 Марта 2009, 01:19:00 »
может быть, надо очистить буфер ввода после scanf?

Оффлайн Zenit084

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Re: Хочу научиться программировать в Linux :)
« Ответ #122 : 14 Марта 2009, 01:23:16 »
Ну, это я уже пробовал, толку ноль.

Оффлайн Saha

  • Активист
  • *
  • Сообщений: 517
    • Просмотр профиля
Re: Хочу научиться программировать в Linux :)
« Ответ #123 : 14 Марта 2009, 01:31:04 »
Цитировать
BUGS
       Never use gets().  Because it is impossible to tell without knowing the
       data in advance how many  characters  gets()  will  read,  and  because
       gets() will continue to store characters past the end of the buffer, it
       is extremely dangerous to use.  It has  been  used  to  break  computer
       security.  Use fgets() instead.
это из man gets =)

Оффлайн Zenit084

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Re: Хочу научиться программировать в Linux :)
« Ответ #124 : 14 Марта 2009, 01:36:03 »
Однако это не тот случай, когда gets нельзя использовать, прога довольно простая. Ну, в любом случае, я и с fgets попробовал, никакой разницы, все равно не работает.

Оффлайн Saha

  • Активист
  • *
  • Сообщений: 517
    • Просмотр профиля
Re: Хочу научиться программировать в Linux :)
« Ответ #125 : 14 Марта 2009, 01:45:39 »
это я понял. Также выяснил, что буфер ввода очистить низя, вроде как=)

Гениально!
Я допер=)
Надо так сделать:
scanf ("%d\n", &menu);

Оффлайн Zenit084

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Re: Хочу научиться программировать в Linux :)
« Ответ #126 : 14 Марта 2009, 02:28:25 »
Мда, не ожидал я такого решения, спасибо за идею. :))

roman1

  • Гость
Re: Хочу научиться программировать в Linux :)
« Ответ #127 : 14 Марта 2009, 02:43:46 »
Прикольная тема, спасибо всем участникам, ясно что я на верном пути ;D Я выбрал Си(без плюсов), к сожалению совсем не знаю математики, да вообще ничего не знаю ибо гуманитарное образование(музыкальное), эх... Но выбором не мучился, купил ряд книг по юникс, линукс, а в них людей тупо делят на два вида - на тех кто си знает, и на всех остальных - вот он и выбор. Начал с "Си для чайников" Дена Гукина мда... имхо незачет Дену, а вот знакомясь с другими книгами ясно осознал то, о чем пишут здесь многие, что выучить язык может любой, а вот думать как программист наверное может только действительно настоящий математик... купил Кнута, буду курить... :2funny:

Оффлайн Zenit084

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Re: Хочу научиться программировать в Linux :)
« Ответ #128 : 14 Марта 2009, 19:04:50 »
Хм, однако на этом история не заканчивается, вот такой код снова работает не так, как ожидалось, а именно предложение ввести строку выводится после собственно ввода строки.
(Нажмите, чтобы показать/скрыть)

Оффлайн Saha

  • Активист
  • *
  • Сообщений: 517
    • Просмотр профиля
Re: Хочу научиться программировать в Linux :)
« Ответ #129 : 14 Марта 2009, 19:09:22 »
ну, здесь все просто: он сначала пишет в буфер, а потом выводит буфер на экран.
Используй fflush(stdout)

Оффлайн Zenit084

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Re: Хочу научиться программировать в Linux :)
« Ответ #130 : 14 Марта 2009, 19:21:46 »
Я уже это попробовал, в каждую строку этот fflush (stdout); запихал, но всё рано тоже самое.

Оффлайн Saha

  • Активист
  • *
  • Сообщений: 517
    • Просмотр профиля
Re: Хочу научиться программировать в Linux :)
« Ответ #131 : 14 Марта 2009, 20:18:55 »
да, чего-то я с \n сплоховал... =)

В общем, так я и не разобрадся со scanf, но вообще ИМХО ее лучше не использовать.
Такой вариант работает, вроде, нормально:
    puts ("Введите 1");   
    fgets(z,10,stdin);
    sscanf(z,"%d", &m);
« Последнее редактирование: 14 Марта 2009, 20:44:48 от Saha »

Оффлайн Zenit084

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Re: Хочу научиться программировать в Linux :)
« Ответ #132 : 14 Марта 2009, 21:49:33 »
Я так понял, что \n переводит поток ввода на другую строку, и ждет ввода там, и только после этого прога принимается за поток вывода. В общем вместо \n надо писать getchar после scanf.

Оффлайн S.Tokarev

  • Активист
  • *
  • Сообщений: 415
    • Просмотр профиля
Re: Хочу научиться программировать в Linux :)
« Ответ #133 : 18 Марта 2009, 16:58:29 »
Ты почти правильно понял.

scanf("%d\n",....) первый Enter не воспринимает как окончание ввода поскольку он съедается форматом. потому она продолжает сканировать ввод и когда второй раз нажимаете ентер вот он и воспринимается как конец ввода ибо всё что ввели после первого ентера до второго по формату не подходит.
scanf всё что не съела оставляет в потоке ввода.
после чего выполняется puts()
после этого выполняется gets которому и достаётся УЖЕ ВВЕДЁННОЕ фуфло.
Так создаётся впечатление что gets работает до puts. На самом деле не gets работает до puts, а символы в потоке ввода появляются до puts.

Теперь что происходит когда нет \n
scanf сканирует ввод но Enter остаётся в буфере ввода ибо по формату не подходит. Вот этот ентер gets и воспринимает как конец ввода своей части. что приводит к тому что у вас снова нет шанса чтолибо ввести.

И наконец getchar не спасёт отца русской демократии. попробуйте ввести
1abc<Enter>
« Последнее редактирование: 18 Марта 2009, 17:08:55 от S.Tokarev »

Оффлайн SONOL

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Хочу научиться программировать в Linux :)
« Ответ #134 : 06 Мая 2009, 12:42:09 »
Начинать программировать можно PureBasic сайт
У него простой синтаксис и изучить его можно за короткое время даже по справке.
В его составе есть более 800 функций, что позволяет разрабатывать проги даже не зная как работает ОСь и что такое API.
С его помощью можно создавать консольные, окнонные и игровые приложения под Windows, Linux и MacOS.

Вот пример создания окна с надписью
; Открываем окно
OpenWindow(1 , 200, 250, 200, 50, "Заголовок окна", #PB_Window_MinimizeGadget)
CreateGadgetList( WindowID (1) )
TextGadget(2, 70, 16, 180, 15, "Привет мир!")

Repeat ; Начало главного цикла Repeat-Until
  Event = WaitWindowEvent() ; Получаем текущий идентификатор события
Until Event = #PB_Event_CloseWindow
End ; Завершаем работу программы
Размер скомпилированой проги всего 14КБ и для её работы ненужны никакие внешние библиотеки.

Вот скрин окна этой проги
« Последнее редактирование: 08 Июня 2009, 14:41:06 от SONOL »

 

Страница сгенерирована за 0.018 секунд. Запросов: 21.