2015-03-05 6 views
0

Цель этой программы - подсчет цифр в алфавитно-цифровом вводе. Однако я использовал цикл, чтобы не выполнять программу, если вход не является буквенно-цифровым.Почему этот цикл бесконечно повторяется?

Это код:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <ctype.h> 

int main(){ 
    int input,isanum,digitcount; 
    printf("\nEnter a number: "); 
    scanf("%d",&input); 
    isanum=isalnum(input); 

    while(isanum==0){ 
    printf("\nIncorrect input. Try again: "); 
    scanf("%d",&input); 
    isanum=isalnum(input); 
    } 
    digitcount=0; 
    while(input!=0){ 
     input=input/10; 
     digitcount++; 
    } 
    printf("\nNumber of digits = %d",digitcount); 
    return 0; 
} 

Проблема с петлей. Он продолжает бесконечно циклически, и игнорирует инструкцию scanf, и я не знаю почему. Я использую isalnum() здесь неправильно?

+0

Проверьте [это] (http://stackoverflow.com/questions/8464620/program-doesnt-wait-for-user-input-with-scanfc-yn) поток. – DanZimm

+0

Возможно, вы захотите прочитать символы с scanf, а не целые числа. В противном случае нет смысла называть isalnum. – Lundin

ответ

1

Необходимо проверить возвращаемое значение scanf().

isalnum() принимает персонажа, но вы проходите мимо int. '1' не совпадает с 1 в C.

Вы, вероятно, должны потреблять всю линию каждый раз, например. с fgets(), а затем проверьте, соответствует ли он вашему желаемому формату ввода, например. с sscanf().

Как бы то ни было, вы никогда ничего не потребляете, вы просто пытаетесь прочитать число, но там нет никого, поэтому он терпит неудачу каждый раз. Невозможно проверить возвращаемое значение scanf().

+0

Вы правы. Но я не совсем знаком с fgets() и sscanf(), не могли бы вы подробнее рассказать о том, как я могу использовать их для достижения этого? – kaizoku

+0

Вы используете 'fgets()' для чтения одной целой строки. Затем вы передаете эту строку в 'sscanf()' или любую другую нужную вам функцию, такую ​​как 'strtol()', если вы хотите только прочитать одно целое число (это просто более простой способ, чем 'sscanf()'). Это позволяет гарантировать, что вы читаете одну строку каждый раз, что, вероятно, больше соответствует ожиданиям пользователей. –

0

Посмотрите, как определяется isalnum(): он ожидает char *. Вы, однако, даете ему int *. Данные хранятся здесь совершенно по-разному.

Кроме того, если вы читаете в int, вы заранее знаете, что это будет буквенно-цифровым, верно?

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