scanf Пропускане

Опитвам се да направя проста C програма за клас и едно от изискванията е да използвам scanf/printf за целия вход и изход. Въпросът ми е защо моят scanf след for цикъла в главния се пропуска и програмата просто се прекратява.

Ето моят код

#include <stdio.h>

void main() {
    int userValue;
    int x;
    char c;

    printf("Enter a number : ");
    scanf("%d", &userValue);
    printf("The odd prime values are:\n");
    for (x = 3; x <= userValue; x = x + 2) {
        int a;
        a = isPrime(x);
        if (a = 1) { 
            printf("%d is an odd prime\n", x);
        }
    }   
    printf("hit anything to terminate...");
    scanf("%c", &c);    
}

int isPrime(int number) {
    int i;
    for (i = 2; i < number; i++) {
        if (number % i == 0 && i != number)
            return 0;
    }
    return 1;
}

Успях да го „поправя“, като добавих друг идентичен scanf след първия, но бих предпочел просто да използвам този.


person Austin Davis    schedule 23.01.2013    source източник
comment
Опитвали ли сте system("PAUSE");?   -  person Cole Johnson    schedule 23.01.2013
comment
това налично ли е в прав C или само C++?   -  person Austin Davis    schedule 23.01.2013
comment
Прав c. Забелязвате липсата на пространство от имена?   -  person Cole Johnson    schedule 24.01.2013


Отговори (1)


Знакът за нов ред, присъстващ в stdin след въвеждането на предишния int, няма да бъде използван от последното извикване на scanf(). Така че извикването на scanf() след цикъла for консумира символа за нов ред и продължава, без потребителят да въвежда нищо.

За да коригирате, без да се налага да добавяте друго scanf() извикване, можете да използвате спецификатор на формат " %c" в scanf() след цикъла for. Това ще накара scanf() да пропусне всички водещи бели знаци (включително нов ред). Имайте предвид, че това означава, че потребителят ще трябва да въведе нещо различно от нов ред, за да прекрати програмата.

Допълнително:

  • проверете резултата от scanf(), за да сте сигурни, че той действително присвоява стойност на променливите, предадени в:

    /* scanf() returns number of assigments made. */
    if (scanf("%d", &userValue) == 1)
    
  • това е задание (и винаги ще бъде вярно):

    if (a = 1){ /* Use == for equality check.
                   Note 'a' could be removed entirely and
                   replace with: if (isPrime(x)) */
    
person hmjd    schedule 23.01.2013
comment
Защо не е бил погълнат от последното обаждане до scanf()? Съжалявам за нов въпрос - person SSH This; 23.01.2013
comment
@SSHThis, scanf("%d") спира да консумира, когато срещне нещо, което не е цифра, а нов ред не е цифра, така че ще остане. - person hmjd; 23.01.2013
comment
благодаря, че разбра тази грешка - person Austin Davis; 23.01.2013
comment
Благодаря, трябва ли да е scanf("%d\n", &userValue);? - person SSH This; 23.01.2013
comment
@SSHТова, да. Това също би свършило работа. - person hmjd; 23.01.2013
comment
Или използвайте C++ с std::cin - person Cole Johnson; 23.01.2013