2014-11-01 2 views
0

Мне нужно прочитать часы: минуты в этом точном формате. Я использую:Подтвердить ввод scanf

int hours, minutes; 

    if (scanf("%d:%d", &hours, &minutes)!= 2) 
    { 
     printf("Wrong input.\n"); 
     return 1; 
    } 
else if (minutes>60 || minutes<0 || hours<0) 
    { 
     printf("Wrong input.\n"); 
     return 1; 
    } 

    time = hours*60 + minutes; 

    /*read another time interval */ 
    if (scanf("%d:%d", &hours, &minutes)!= 2) 
    { 
     printf("Wrong input 2.\n"); 
     return 1; 
    } 
else if (minutes>60 || minutes<0 || hours<0) 
    { 
     printf("Wrong input 2.\n"); 
     return 1; 
    } 
    ... 

отлично работает, но мне нужно, чтобы получить «неправильный ввод» также в ситуациях, когда кто-то входит, например, 5: 38abc

+0

вам нужно узнать, не является ли тип (минуты) или тип (часы) не 'int'. Можете ли вы поместить свои объявления в часах и минутах в фрагменте кода? Если вы объявили свои 'часы' и' минуты' в 'int', все равно, что чистая' int' будет некорректной! – ha9u63ar

+0

Я объявил их как int. Проблема в том, что «abc» в конце не вызывает ошибки в этом scanf, но позже в коде следующего сканированияf, который также читает int. – Jcht

+0

не могли бы вы поместить больше кода в этот фрагмент, рассказывая нам, что вы сделали в комментариях, на самом деле не рисуют хорошую картину! – ha9u63ar

ответ

1

Добавить оператор в строку формата в соответствии с новой строкой:

int hours, minutes; 
char str[2]; 

if (scanf("%d:%d%1[\n]", &hours, &minutes, str)!= 3) 

%[\n] матчей символы перевода строки, а поле шириной 1 делает остановки соответствия ровно через 1 символ.

0

Традиционный способ состоит в том, чтобы прочитать всю строку, используя getline(3) или fgets(3) (так что строка находится в буфере), а затем проанализировать эту строку. Вы можете использовать sscanf(3) - возможно, с его спецификатором %n - или вы могли бы разобрать эту строку более вручную, например. strtol(3) (который устанавливает конечный указатель).

Так что-то вроде:

int endpos= -1; 
char linbuf[32]; 
memset(linbuf, 0, sizeof(linbuf)); 
if (!fgets(linbuf, sizeof(linbuf)) exit(EXIT_FAILURE); 
if (sscanf(linbuf, "%O2d:%02d%n", &hour, &minute, &endpos)<2) 
    exit(EXIT_FAILURE); 
if (endpos!=6) exit(EXIT_FAILURE); 
if (hour<0 || minute<0 || hour>=24 || minute>=60) exit(EXIT_FAILURE); 

Конечно вы бы заменить exit(EXIT_FAILURE); с более удобной отбраковки.

BTW, вы должны указать, подходит ли 1:2 или если требуется 01:02. И вы принимаете пустую строку как представляющую полдень?

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