如何编写确定输入是素数还是数值的C程序

时间:2018-11-25 14:21:22

标签: c validation primes numeric

我试图用C编写一个程序,要求输入数字,然后确定它是否是质数。如果输入是非数字字符或字符串,则输出消息INVALID INPUT。我设法创建了可以确定数字是否为质数以及是否为非数字的代码,但是当我尝试将它们组合时,它将无法正常工作。例如,如果我输入一个非数字值,它将输出正确的消息,但是当我输入一个数字值时,什么也没发生,我不确定为什么。有人可以帮忙吗?

#include <stdio.h>
#include <string.h>
#define FALSE 0
#define TRUE 1

int numeric( char *string )
{
    int i, valid;
    valid = TRUE;

    if (string[i] < '0' || string[i] >'9')
        valid = FALSE;
    return valid;
}

void main()
{
    char number[5];
    printf("Please enter a decimal number>");
    gets( number );

    if (numeric(number) == TRUE)
    {
        int n, i, a = 0;
        scanf_s("%d", &n);

        for (i = 2; i <= n / 2; ++i)
        {
            if (n%i == 0)
            {
                a = 1;
                break;
            }
        }

        if (n == 1)
        {
            printf("1 isn't a prime number.");
        }
        else
        {
            if (a == 0)
                printf("number entered is a prime number");
            else
                printf("number entered is not a prime number");
        }
    }
    else 
        printf("INVALID INPUT \n"); 
} 

1 个答案:

答案 0 :(得分:2)

除了@Michail的注释中提到的错误(未能在<StackPanel> <CheckBox x:Name="MaterialDesignOutlinedTextFieldTextBoxEnabledComboBox" IsChecked="True" Margin="32,0,0,8"> Enabled </CheckBox> <TextBox Style="{StaticResource MaterialDesignOutlinedTextFieldTextBox}" Margin="32,0,0,0" VerticalAlignment="Top" Height="100" AcceptsReturn="True" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" materialDesign:HintAssist.Hint="This is a text area" IsEnabled="{Binding Path=IsChecked, ElementName=MaterialDesignOutlinedTextFieldTextBoxEnabledComboBox}" /> </StackPanel> 中将<TextBox Style="{StaticResource MaterialDesignOutlinedTextFieldTextBox}" Margin="32,0,0,0" VerticalAlignment="Top" Height="100" AcceptsReturn="True" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" materialDesign:HintAssist.Hint="This is a text area" /> 初始化为零:

您的问题是,在i的真实分支中,您调用numeric,这将尝试从if (numeric(number))读取新输入。您在致电scanf_s时已经读过STDIN中的电话号码。您观察到的行为(“什么也没有发生”)是可以预期的:您的程序正在等待您输入更多的输入。

您可以随时进行缓冲区溢出,但这是一个单独的问题。