【问题标题】:My program immediately exits after it asks for a character [duplicate]我的程序在要求输入字符后立即退出[重复]
【发布时间】:2021-08-13 02:17:40
【问题描述】:

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

下面的问题是什么:

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() leaves the newline char in the bufferscanf 转换在它无法转换的第一个字符处停止,通常(但不一定)是空格或换行符,并且该字符保留在输入缓冲区中。 next scanf() 将读取它。格式说明符 %d%s%f 会自动过滤这些前导空白字符,但 %c%[]%n 不会。您可以通过在% 之前添加一个空格来指示scanf 这样做。所以scanf(" %c", &amp;sort);.
  • scanf() 家族不是简单的函数,但学生很快就会上手。我建议至少花一个小时阅读手册页和一个小测试程序。
  • 还要注意 Sort() 函数没有后卫操作来处理传递的值不是四个预期值之一,例如 else printf("Invalid entry\n");程序更健壮。
  • 您的建议立即解决了我的代码问题。非常感谢您的回复。 :))

标签: c output user-input primes


【解决方案1】:

我认为这会对你有所帮助。 在您的 scanf 函数之后放置一个 fflush(),例如:

scanf("%d", &num);
fflush(stdin);

或者你用更简单的方法

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;
}

将您的scanf("%d", &amp;num); 替换为num = getNumber(); - 可行!

所以,这里有另一个带有 A-D 字母的代码

我希望现在就足够了 - 所有用户都原谅我不完整的代码审查 ^^" :

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;
}

将您的scanf("%d", &amp;num); 替换为num = getNumber(1);

将您的scanf("%d", &amp;sort); 替换为sort = getNumber(2);

【讨论】:

  • 很抱歉,这是输入流上的未定义行为scanf 函数旨在处理该问题而无需任何变通方法。
  • 现在,代码是正确的。对不起。我忘记了什么。我认为使用该功能,您可以使用 scanf 更好的方法。
  • 提供了 scanf(),因此我们不必编写诸如此类的不可移植代码,但它不是输入 OP 遇到问题的整数值,而是 以下 字符'A'
  • @WeatherVane 我改变了支票的位置。现在只允许使用数字!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 2019-05-08
  • 2023-04-10
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多