C 我的程序在请求字符后立即退出

C 我的程序在请求字符后立即退出,c,output,user-input,primes,C,Output,User Input,Primes,我希望大家都做得很好。我的老师给了我这个家庭作业 以下是哪个问题: Write a program that will ask for n positive whole numbers. Your program will only stop asking for a number if the input number is 0 or < 0. From these inputs, determine all the prime numbers. After determining th

我希望大家都做得很好。我的老师给了我这个家庭作业

以下是哪个问题:

Write a program that will ask for n positive whole numbers. Your program will only stop asking for a number if the input number is 0 or < 0. From these inputs, determine all the prime numbers. After determining the prime numbers, write a menu option shown below:
                
            [A] Display One’s   
            [B] Display Ten’s 
            [C] Display Hundred’s 
            [D] Display Thousand’s 

    If the user presses on of these options, then it will display what is being asked. To further understand and shorten the instructions, an illustration is provided below.

Input numbers: 123, 112, 1377, 2, 13, 0
Prime numbers: 123 1377 2 13
If the user presses ‘A’, then the output is
        123     = 3
        1377    = 7
        2   = 2
        13  = 3
If the user presses ‘B’, then the output is
        123 = 23
        1377    = 77
        2   = 0
        13  = 13
If the user presses ‘C’, then the output is
        123 = 123
        1377    = 377
        2   = 0
        13  = 0
If the user presses ‘D’, then the output is
        123 = 0
        1377    = 1377
        2   = 0
        13  = 0


我写了一个我认为可以解决这个问题的程序,但是在我输入了一个字符a,B,C,D后,程序会立即终止吗? 如果有人能指出任何其他错误或有任何建议。我会对他们敞开心扉,我会很感激的。事先非常感谢

#include<stdio.h>

int isPrime(int num);
void Sort(char sort, int psize, int* prime);

int main ()
{
    int psize=0;
    int i, num=1;
    int arr[1000], prime[1000];
    char sort;

    do
    {
        printf("Enter array element:");
        scanf("%d", &num);

        if(num<=0) break;

        if(isPrime(num))
        {
            prime[psize]= num; //assign to prime array if it is a prime
            psize++;
        }

    } while(num>0);

    printf("\nEnter [A] to Display One's\nEnter[B] Display Ten's\nEnter[C]Display Hundred's\nEnter[D]Display Thousand's");

    scanf("%c", &sort);

    Sort(sort, psize, prime);

}

int isPrime (int num)
{
  int i, flag=1;
  for(i=2;i<num;i++)
   {
    if(num%i==0)
      {
       flag=0;
       break;
      }
   }
   return flag;
}

void Sort(char sort, int psize, int* prime)
{
    int i, ans;

    if(sort == 'A'){
        printf("Ones\n");
        for(i=0;i<psize;i++)
        {
            ans = prime[i] % 10;
            printf("%d = %d\n", prime[i], ans);
        }
    }

    else if(sort == 'B'){
        printf("Tens\n");
        for(i=0;i<psize;i++)
        {
            if(prime[i] >= 10)
            ans = prime[i] % 100;
            else
            ans = 0;
            printf("%d = %d\n", prime[i], ans);
        }
    }

    else if(sort == 'C'){
        printf("Hundreds\n");
        for(i=0;i<psize;i++)
        {
            if(prime[i] >= 100)
            ans = prime[i] % 1000;
            else
            ans = 0;
            printf("%d = %d\n", prime[i], ans);
        }
    }
    else if(sort == 'D'){
        printf("Thousands\n");
        for(i=0;i<psize;i++)
        {
            if(prime[i] >= 1000)
            ans = prime[i] % 10000;
            else
            ans = 0;
            printf("%d = %d\n", prime[i], ans);
        }
    }

}



我想那会帮你的。 在scanf函数后放置一个fflush,如:

scanf("%d", &num);
fflush(stdin);
或者你用一种更简单的方法

替换扫描%d,&num;num=getNumber1


替换扫描%d,&sort;使用sort=getNumber2

请看。scanf转换在无法转换的第一个字符处停止,该字符通常是空格或换行符,但不一定是空格或换行符,并且该字符保留在输入缓冲区中。下一次扫描将读取该文件。格式说明符%d和%s及%f会自动筛选此类前导空白字符,但%c和%[]及%n不会。您可以通过在%之前添加空格来指示scanf执行此操作。所以扫描%c,&sort;。scanf系列并不是简单的函数,但学生很快就会想到它们。我建议至少花一个小时处理手册页和一个小测试程序。请注意,排序函数没有后保护操作来处理传递的值不是四个期望值之一,例如else printfInvalid entry\n;捕获意外输入可以使易受攻击的程序更加健壮。您的建议立即解决了我在代码方面遇到的问题。非常感谢您的回复很抱歉,这是输入流上未定义的行为。scanf函数设计用于处理该问题,无需任何解决方法。现在,代码是正确的。很抱歉我忘了什么。我认为有了这个函数,您就有了更好的方法,因为提供了scanf.scanf,所以我们不必编写这样的不可移植代码,但它不是输入OP遇到问题的整数值,而是输入下面的字符“a”等。@WeatherVane我改变了检查的位置。现在只允许数字!
int getNumber()
{
    char userinput = '1';
    int number = 0;
    /*
        Ascii-table
        0 = 48
        1 = 49
        ...
        9 = 57
    */
    while(1)
    {
      userinput = getchar();
      if (userinput == '\n') break;
      if (userinput >= 48 && userinput <= 57)
         number = (number * 10) + (userinput - 48);
    }
    
    return number;
}
int getNumber( int opt )
{
    char userinput = '1';
    int number = 0;
    /*
        Ascii-table
        0 = 48
        1 = 49
        ...
        9 = 57
    */
    while(1)
    {
      userinput = getchar();
      if (userinput == '\n') break;
      
      /*
        opt (Options)
            1: Numbers
            2: Letters A-D
            Other numbers undefined!
      */
      switch(opt)
      {
        case 1:
            /* Only 0-9 allowed */
            if (userinput >= 48 && userinput <= 57)
                number = (number * 10) + (userinput - 48);
        break;
        case 2:
            /* Only A-D allowed */
            if (userinput >= 'A' && userinput <= 'D')
                number = userinput;
        break;
        default:
            /* Nothing to do - wrong input */
            number = 0; 
        break;
      }
      
    }
    
    return number;
}