2015-09-28 2 views
0

Я новичок в программировании. Я работаю над домашним заданием, чтобы помочь нам понять scanf и массивы. Предполагается, что программа попросит пользователя ввести неизвестный набор чисел. Каждый набор чисел должен быть разделен пробелом, подобным ниже, без ввода ввода.Проблемы с использованием scanf внутри цикла while

14 15 16 

Пользователь может также ввести числа на отдельной строке, а не с помощью пробелов, но опять-таки на последний номер пользователь занесены не должен нажать кнопку ввода.

12 13 
44 55 
5 

Пользователь должен нажать ctrl-d, чтобы указать конец ввода. Программа должна отображать количество элементов, введенных пользователем, а также отображать введенные пользователем цифры. Я читал и думаю, что у меня есть базовая концепция работы scanf, но у меня все еще есть некоторые трудности. Кодовый вид работ. Однако, если пользователь просто вводит числа на одной строке, им нужно нажать ctrl-d три раза, чтобы он вышел из цикла и отобразил информацию.
Из того, что я нашел в Интернете и понимаю, я думаю, что он не работает, потому что пользователь не нажал return, поэтому вход не был сброшен в stdin. Поэтому, если я правильно понимаю, в первый раз я нажму ctrl-d, пока вы сбрасываете ввод. Затем во второй раз, когда я нажму ctrl-d, он, наконец, поместит EOF в поток, и в третий раз он, наконец, прочитает -1, созданный EOF, и выйдет из цикла. Есть ли способ принудительного ввода потока после ввода ctrl-d.

#include <stdio.h> 
int main() 
{ 
    int numbers[20]; 
    int i = 0, count, result, n; 
    int flag = 0; 

    printf("Please enter a seiries of numbers:\n"); 
    while (flag == 0) 
    { 
     result = scanf("%d", &n); //scan user input into n variable along with getting scanf return value and storing in result variable 
     printf("result =%i \n", result); //Just printing scanf return value to insure it doing what I think it should be doing 
     if (result == 1) 
     { 
      numbers[i] = n; //if scanf return value is 1 places value of n into first element of array 
      i++; //used to increment my array 
      flag = 0;//keeps value of flag equal to 0 in order to stay in loop 
     } 

     if(result == -1) //checks to see if result = to -1 should be value returned if cntl +d is entered 
     { 
      flag = 1; //sets flag to 1 when cntrl +d is entered in order to exit loop. 
     } 
    } 

    for (count = 0 ; count < i ; count++) //loop to print I which is representing number of user inputs and the actual numbers entered by the user. 
    { 
     printf("\ni= %i numbers= %i\n", i, numbers[count]); 
    } 
    return 0; 
} 
+3

Первый совет, напишите код, который люди могут читать не только компиляторы. –

+0

'scanf' возвращает любой номер' -ve' на неправильном входе, не могу угадать '-1'. Так что можно сравнить с '0'. – ameyCU

+0

Идиомы исследования больше. Код меньше. 'int val, n = 0; while (scanf ("% d", & val)! = EOF) {numbers [n ++] = val; } printf («Чтение% d чисел. \ n», n); 'должно работать нормально. Ctrl-D - это конец файла. Предоставление его более одного раза бессмысленно в каждой системе, которую я видел. – Gene

ответ

2

Я не дам вам решение напрямую, но будет стараться помочь вам улучшить кодирования в C. Чем больше вы работаете с C чем больше вы узнаете, что можно написать довольно компактный код, когда язык освоен.

Вы можете опустить flag, потому что это зависит от result.
И вы можете опустить result, потому что это всего лишь возвращаемое значение scanf.
Вы можете опустить n и использовать массив numbers.
И вы можете использовать препроцессор для использования постоянного числа (часто для размеров массива, как в вашем случае).

Посмотрите на это. Может быть, это поможет вам получить представление о том:

#include <stdio.h> 

#define COUNT 20 

main() { 

    int numbers[COUNT]; 
    int i; 

    i = 0; 
    while (scanf("%d", &numbers[i]) == 1 && i < COUNT) 
     printf("\t%d\n", numbers[i++]); 
    return 0; 
} 

P.S .: Я рекомендую знакомясь с различными способами доступа к элементам массива и читать про указатели. У них очень тесные отношения.

Адрес первого элемента в массиве: numbers
Access i й элемент массива: numbers[i]
Эквивалентное: *(numbers + i)
Другой эквивалент: *(i+numbers)
Удивление, но опять же эквивалент: i[numbers]
Адрес i го элемента массив: &numbers[i]

K & R - большой ресурс информации и обучения.

Смежные вопросы