Мой простой код для получения информации от пользователя & 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?
gcc, описывающий fflush (поток), говорит:
Если поток указывает на выходной поток или поток обновления, в который не была введена самая последняя операция, функция fflush вызывает любые неписанные данные для тот поток, который должен быть доставлен в среду хоста, для записи в файл; в противном случае поведение не определено.
blockquote>fflush не определен для выходных потоков. Он определен для выходных потоков и для двунаправленных потоков, для которых была выведена последняя операция.
stdin
является входным потоком, а fflush (stdin) не имеет значения.Итак, когда вы вводите 23 и нажимаете ввод. После этого
fflush
ничего не делает. Иgets()
функция просто заняла\n
. Замените им scanf.В коде можно сделать много улучшений. Посмотри.
Это действительно потому, что ваш код на C сломан, это не вина Ubuntu или чего-то еще.
Вот несколько советов о том, как исправить это, чтобы работать, и как скомпилировать его.
system("pause");
не делай этого. Избегайте системных вызовов, так как они жестко кодируют требование конечной системы (которого нет в Linux)
gets(b[top].name);
следует заменить на scanf("%s", &b[top].name);
, что является более надежный способ ввода строки.
main()
является недействительным , вы должны заменить main()
на int main()
и заменить system("pause");
простым return 0;
, чтобы сделать ваши стандарты C совместимыми.
Как скомпилировать
Компиляция в 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
.
Надеюсь, это поможет