C programa corre bem no Windows, mas quando executado no Ubuntu não está pedindo corda?

1

Meu código simples para obter informações do usuário & amp; imprimir o mesmo funciona bem com o Windows OS (no Dev C ++), mas Mas não está pedindo corda quando executado no Ubuntu (tentou Terminal / Dev C + + via 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");

  }

Saída no Ubuntu:

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

Depois que eu digito 23, ele precisa perguntar o nome do livro, mas ele está pulando essa parte & amp; novamente pede o próximo isbn não.

Depois de algumas tentativas cegas, descobri que quando recebe (b [top] .name); Obtém (b [top] .name); foi usado duas vezes como este, funcionou bem ....

Minha pergunta é por que é assim? Como fazer o ubuntu compile & amp; executar programas que funcionam bem no windows?

    
por Ravi Ojha 07.08.2012 / 18:53

2 respostas

6

Isto é realmente porque o seu código C está quebrado, não é culpa do Ubuntu ou qualquer outra coisa.

Aqui estão algumas dicas sobre como corrigi-lo para funcionar e como compilá-lo.

  1. system("pause"); não faça isso. Evite chamadas do sistema, pois elas codificam um requisito do sistema final (que não existe no Linux)

  2. gets(b[top].name); deve ser substituído por scanf("%s", &b[top].name); , que é uma maneira mais confiável de usar a entrada de strings.

  3. main() é inválido você deve substituir main() por int main() e substituir system("pause"); por um simples return 0; para tornar seus padrões C compatíveis.

Como compilar

Compilar no Linux é muito mais simples que o Windows (para programas pequenos como este).

  • Abra uma linha de comando.
  • cd ~/your/code/
  • Compile com este comando: gcc -Wall --pedantic -o my_program my_program.c
    • Se este comando falhar, você precisa executar sudo apt-get install build-essential

E por fim, alguns conselhos importantes: Dev C ++ expirou em 2005 - No Windows, mude para o Visual C ++ 2010 Express, no Linux use o Eclipse ou um editor de texto e o comando gcc .

Espero que isso ajude

    
por Leo Adamek 07.08.2012 / 19:21
3

gcc descreve fflush (stream), diz:

  

Se o fluxo apontar para um fluxo de saída ou um fluxo de atualização no qual   operação mais recente não foi inserida, a função fflush causa   dados não gravados para que o fluxo seja entregue ao ambiente host   ser escrito no arquivo; caso contrário, o comportamento é indefinido.

fflush não está definido para fluxos de saída. Está definido para saída fluxos e para fluxos bidirecionais em que a última operação foi saída. stdin é um fluxo de entrada e fflush (stdin) não tem significado.

Então, quando você inserir 23 e pressione enter. Depois disso fflush não faz nada. E gets() funcionou apenas em \n . Substitua por scanf.

Há muita melhoria pode ser feita no código. Olhe através disso.

    
por Web-E 07.08.2012 / 19:24