2014-11-27 2 views
0
#include <stdio.h> 
#include <string.h> 
int main() 
{ 
    int array[1000]={0}, n, c, d, swap; 
    printf("Enter number of elements\n"); 
    scanf("%d", &n); 

    printf("Enter %d integers\n", n); 

    for (c = 0; c<n; c++) 
     scanf("%d", &array[c]); 


    for (c = 0 ; c < (n - 1); c++) 
    { 
     for (d = 0 ; d < n - c - 1; d++) 
     { 
      if (array[d] > array[d+1]) /* For decreasing order use < */ 
      { 
       swap  = array[d]; 
       array[d] = array[d+1]; 
       array[d+1] = swap; 
      } 
     } 
    } 

    printf("Sorted list in ascending order:\n"); 

    for (c = 0 ; c < n ; c++) 
     printf("%d\n", array[c]); 

    int result= array[n-1]-array[0]; 
    printf("The difference between the largest and smallest: %d",result); 
    puts(""); 
    return 0; 
} 

Этот программный пузырь сначала сортирует входные данные и дает результат разности между самым большим и наименьшим числом. Я хочу закончить ввод при вводе enter. Например, вход = 6 4 2, выход = 4. (завершите ввод «enter»)Как закончить ввод при вводе

+0

'Как закончить ввод при вводе передано 'конец ввода уже отмечен нажатием' ENTER' для почти всех API-интерфейсов i/p. Пожалуйста, сообщите о своей проблеме правильно. –

+0

Нет, конец ввода (то есть конец файла на терминале) - это * не * ключ 'ENTER' (в Linux это' Ctrl-D') –

+0

http://stackoverflow.com/a/ 27150437/971127 – BLUEPIXY

ответ

0

Вам необходимо прочитать целую строку, например. с fgets(3), getline(3) или даже (если работает на терминале, например, под Linux) readline(3) (который предлагает возможности редактирования). Затем преобразуйте каждую строку в число с помощью sscanf(3) или strtol(3) и проверьте, не завершилось преобразование.

Что-то вроде

const int arraysize = sizeof(array)/sizeof(array[0]); // 1000 
printf("Enter at most %d integers ended by a blank line\n", arraysize); 
for (c = 0; c<arraysize; c++) { 
    char linebuf[80]; 
    memset(linebuf, 0, sizeof(linebuf)); // perhaps unneeded 
    if (!fgets(linebuf, sizeof(linebuf), stdin)) 
     break; 
    if (sscanf(linebuf, "%d", &array[c])<=0) 
     break; 
} 
// here c contains the number of actually read integers. 

Прочитайте документацию каждой функции, которую вы используете. Обратите внимание, что scanf, fscanf и sscanf возвращают количество успешно отсканированных товаров.

Очистка memset(3), вероятно, не нужна .. но на всякий случай я всегда очищаю буфер.

+0

Незначительный: '' '' не требуется в ''% d ''. ''% d "' потребляет ведущее белое пространство даже без '' '' – chux

0

Что я понимаю из вашей проблемы, вы хотите разбить следующий цикл после ввода чисел.

for (c = 0; c<n; c++) 
    scanf("%d", &array[c]); 

Если это так. Затем вы можете использовать следующий цикл.

for (c = 0; c < n; c++) { 
     if (scanf("%d", &array[c]) != 1) { 
       n = c; // actual number of integer input. 
       break; 
     } 
    } 

Теперь, если вы введете какой-либо алфавит, а затем введите ключ, он разрывает цикл for.

+0

Спасибо @chux. Я обновил свой ответ в соответствии с вашим предложением. –

0

Для завершения ввода, когда Enter или '\n' происходит является сложной задачей, используя scanf("%d",..., как "%d" первый потребляет любой пробельных включая '\n'. Нужно по-другому посмотреть на '\n'.

for (c = 0; c<n; c++) 
    int ch; 
    while ((ch = fgetc(stdin)) != '\n' && isspace(ch)); 
    if (ch == '\n' || ch == EOF) break; 
    ungetc(ch, stdin); 
    if (scanf("%d", &array[c]) != 1) Handle_NonNumericInput(); 
} 

или еще лучше, используйте fgets(). Легко улавливать всевозможные недопустимые данные.

#include <limits.h> 
#define MAX_INT_SIZE (sizeof(int)*CHAR_BIT/3 + 3) 

c = 0; 
char buf[n*(MAX_INT_SIZE + 1) + 2]; 
if (fgets(buf, sizeof buf, stdin)) { 
    char *p = buf; 
    for (; c<n; c++) 
    int n; 
    if (sscanf(p, "%d %n", &array[c], &n) != 1) break; 
    p += n; 
    } 
    if (*p) Handle_Missing_or_Extra_or_Nonnumeric_input(); 
} 
Смежные вопросы