Программа C хорошо работает в Windows, но при запуске в Ubuntu она не запрашивает строку

Мой простой код для получения информации от пользователя & amp; print то же самое отлично работает с ОС Windows (на Dev C ++), но не запрашивает строку при запуске в Ubuntu (пробовал Terminal / Dev C ++ через WINE / Code Blocks)

   #include<stdio.h>
   void display();
   struct book
  {
         int isbn;
         char name[25];
  }b[5];

   void PUSH()
   {
        int top;
        for(top=0;top<5;top++)
        {
        printf("Enter the ISBN no:");
        scanf("%d",&(b[top].isbn));
        printf("Enter the name:");
        fflush(stdin);
        gets(b[top].name);
        }
   }
  main()
  {
             PUSH();
             display();
  }
  void display()
  {
      int i;
      for(i=0;i<5;i++)
      {

      printf("----------------\nISBN no: %d",(b[i].isbn));
      printf("\nBook Name: %s \n",(b[i].name));
      }
      printf("----------------\n");
  }
  void POP()
  {
       int i;
      for(i=0;i<5;i++)
      {

      printf("----------------\nISBN no: %d",(b[i].isbn));
      printf("\nBook Name: %s \n",(b[i].name));
      }
      printf("----------------\n");

  }

Вывод в Ubuntu: [ 113]

   Enter the ISBN no:23
   Enter the name:Enter the ISBN no:

После того, как я ввел 23, он должен спросить название книги, но пропускает эту часть & amp; снова просит следующий номер.

После нескольких слепых попыток я обнаружил, что когда получает (b [top] .name); получает (б [наверх] .name); был использован дважды, как это работало нормально ....

Мой вопрос: почему так? Как сделать Ubuntu скомпилировать & amp; запускать программы, которые нормально работают на windows?

1
задан 7 August 2012 в 22:20

2 ответа

gcc, описывающий fflush (поток), говорит:

Если поток указывает на выходной поток или поток обновления, в который не была введена самая последняя операция, функция fflush вызывает любые неписанные данные для тот поток, который должен быть доставлен в среду хоста, для записи в файл; в противном случае поведение не определено.

fflush не определен для выходных потоков. Он определен для выходных потоков и для двунаправленных потоков, для которых была выведена последняя операция. stdin является входным потоком, а fflush (stdin) не имеет значения.

Итак, когда вы вводите 23 и нажимаете ввод. После этого fflush ничего не делает. И gets() функция просто заняла \n. Замените им scanf.

В коде можно сделать много улучшений. Посмотри.

0
ответ дан 7 August 2012 в 22:20

Это действительно потому, что ваш код на C сломан, это не вина Ubuntu или чего-то еще.

Вот несколько советов о том, как исправить это, чтобы работать, и как скомпилировать его.

  1. system("pause"); не делай этого. Избегайте системных вызовов, так как они жестко кодируют требование конечной системы (которого нет в Linux)

  2. gets(b[top].name); следует заменить на scanf("%s", &b[top].name);, что является более надежный способ ввода строки.

  3. main() является недействительным , вы должны заменить main() на int main() и заменить system("pause"); простым return 0;, чтобы сделать ваши стандарты C совместимыми.

    [ 1117]

Как скомпилировать

Компиляция в Linux намного проще, чем Windows (для небольших программ, подобных этой).

  • Открыть командную строку.
  • cd ~/your/code/
  • Скомпилировать с помощью этой команды: gcc -Wall --pedantic -o my_program my_program.c
    • Если эта команда не выполнена, вам нужно запустить sudo apt-get install build-essential

И, наконец, несколько важных советов: Dev C ++ вымер в 2005 г. - В Windows переключитесь на Visual C ++ 2010 Express, в Linux используйте Eclipse или текстовый редактор и команду gcc.


Надеюсь, это поможет

0
ответ дан 7 August 2012 в 22:20

Другие вопросы по тегам:

Похожие вопросы: