C编程:如何检查用户是否仅在以下表达式中输入了数值?

里沙卜

我将以下日期作为用户输入的某个日期:mm / dd / yyyy。

如何确定用户仅输入数字值,如果不是,则再次提示他输入有效日期。我已经在根据输入的值检查日期是否有效,但是如果用户输入的值不完全是数字,则程序崩溃。

请帮忙...

代码:

int x=0;
printf("\nEnter the date of birth(mm/dd/yyyy):");
do
{
    scanf("%d/%d/%d",&add.dob.month,&add.dob.day,&add.dob.year);
    if((add.dob.month<13 && add.dob.month>0) && (add.dob.day>0 && add.dob.day<32) && (add.dob.year<2016))
    {
        x=1;
    }
    else
    {
        printf("\nThe above date of birth is invalid.\nEnter a valid date of birth(mm/dd/yyyy):");
    }
}while(x!=1);
大卫·兰金

有几个问题。如果使用,scanf 请检查其返回值除了数字有效性检查外,如果用户输入的不是整数,还可能需要刷新输入缓冲区。尽管有多种方法可以执行此操作,但一种与您的方法保持一致的方法只是简单地执行正在执行的检查,然后使用第二个do/while循环手动刷新输入缓冲区您还可以改变逻辑并测试是否有任何一个真实的条件,迫使另一个提示输入日期。如上所述,有许多方法可以解决此问题。将此视为您收到的其他答案之一。

int c = 0;          /* value to test for end of input buffer */

printf("\nEnter the date of birth(mm/dd/yyyy):");

while ((scanf("%d/%d/%d",&add.dob.month,&add.dob.day,&add.dob.year) != 3) ||
       (add.dob.month < 1) || 
       (add.dob.month > 12 ) ||
       (add.dob.day < 1 ) ||
       (add.dob.day > 31) ||
       (add.dob.year < 1) || 
       (add.dob.year > 2015))
{
    printf("\nThe above date of birth is invalid.\nEnter a valid date of birth(mm/dd/yyyy):");
    do { c = getchar(); } while (c != '\n' && c != EOF);  /* flush input buffer */
}

如前所述,从中读取信息的一种更可靠的方法stdin是使用fgets将日期作为字符串读取到缓冲区中getline,然后从缓冲区中解析月,日,年信息。这也可以通过许多方式来完成。由于您最终将要从字符转换为十进制,因此也可以只使用strtol解析和转换,而不是使用指针降低字符串或使用strtok或进行解析strsep(因为每个字符都需要在分离后转换为十进制)。这是一个快速的示例,提供了相当强大的解决方案。它还允许在以下日期mm-dd-yyyymm.dd.yyy之外输入日期mm/dd/yyyy

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <errno.h>

#define SZDATE 12

int main (void) {

    int mm = 0;                     // month/day/year values
    int dd = 0;
    int yyyy = 0;
    int gooddate = 0;               // flag signifying valid date
    char datestr[SZDATE] = {0};     // buffer to hold input string
    char *p = NULL;                 // pointer to use with strtol
    char *endptr = NULL;            // end pointer for strtol
    long val = 0;                   // long value for strtol

    while (gooddate == 0)
    {
        printf("\nEnter the date of birth (mm/dd/yyyy): ");

        /* read string with fgets */
        fgets (datestr, SZDATE-1, stdin);

        /* test sufficient length */
        if (strlen (datestr) < 8) {
            printf ("\n insufficient date length entered, try again.\n");
            continue;
        }

        /* parse month value with strtol (with error checking) */
        errno = 0;
        val = strtol (datestr, &endptr, 10);
        if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
            || (errno != 0 && val == 0)
            || (endptr == datestr)
            || (*endptr != '/' && *endptr != '-' && *endptr != '.')
            || (val < 1)
            || (val > 12)) {
                printf ("\n invalid month entered, try again.\n");
                continue;
        }
        mm = (int) val;     /* set month on successful conversion   */

        p = ++endptr;       /* set p to start of day, reset endptr  */
        endptr = NULL;

        /* parse day value with strtol (with error checking) */
        errno = 0;
        val = strtol (p, &endptr, 10);
        if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
            || (errno != 0 && val == 0)
            || (endptr == p)
            || (*endptr != '/' && *endptr != '-' && *endptr != '.')
            || (val < 1)
            || (val > 31)) {
                printf ("\n invalid day entered, try again.\n");
                continue;
        }
        dd = (int) val;     /* set day on successful conversion     */

        p = ++endptr;       /* set p to start of year, reset endptr */
        endptr = NULL;

        /* parse year value with strtol (with error checking) */
        errno = 0;
        val = strtol (p, &endptr, 10);
        if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
            || (errno != 0 && val == 0)
            || (endptr == p)
            || (*endptr != '\n' && *endptr != 0)
            || (val < 1900)
            || (val > 2015)) {
                printf ("\n invalid year entered, try again.\n");
                continue;
        }
        yyyy = (int) val;   /* set year on successful conversion    */

        gooddate = 1;       /* set gooddate flag ending loop        */
    }

    printf ("\n valid date is: %d/%d/%d\n\n", mm, dd, yyyy);

    return 0;
}

考虑与strtol转换相关的检查您可能想要添加更多。另外,请尝试使用strtok或类似内容进行分析并进行比较。这只是将读为字符串然后进行解析的一种方式。它可以通过许多不同的方式来完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C编程:如何检查用户是否仅在以下表达式中输入了数值?

来自分类Dev

以下表达式如何在python中工作?

来自分类Dev

Python-如何对以下表达式求值?

来自分类Dev

如何在Java中的以下表达式中获取值

来自分类Dev

C ++中的魔术具有以下表达式x = y-x +(y = x)

来自分类Dev

以下表达式做什么?

来自分类Dev

如何检查C中的表达式是否恒定?

来自分类Dev

检查用户是否输入了空白的c ++

来自分类Dev

用于检查用户是否输入了四舍五入到100的值的正则表达式验证器

来自分类Dev

以下表达式在scala中是什么意思?

来自分类Dev

make文件中的以下表达式是什么意思?

来自分类Dev

JSCS:运算符应遵循以下表达式

来自分类Dev

如何检查用户是否输入了促销代码?

来自分类Dev

如何检查用户是否输入了与漩涡哈希匹配的密码?

来自分类Dev

如何检查用户是否输入了单个字母?

来自分类Dev

如何检查用户是否在java中输入了一个符号?

来自分类Dev

在C编程中检查字符串是否全为带正则表达式的字母数字

来自分类Dev

仅在以用户输入开头的情况下才如何匹配正则表达式?

来自分类Dev

检查用户是否输入了数字

来自分类Dev

检查用户是否输入了。##美分

来自分类Dev

如何以编程方式在F#中构建以下报价表达式?

来自分类Dev

如何以编程方式在F#中构建以下报价表达式?

来自分类Dev

如何检查整个输入字符串(用空格分隔的实数)是否与Python中的正则表达式匹配?

来自分类Dev

如何使用户仅在Python程序中输入整数值

来自分类Dev

如何使用PHP和正则表达式检查输入值是否正确?

来自分类Dev

是否可以包装仅在C#中的表达式中使用的类型?

来自分类Dev

检查用户是否仅在字符串中输入字母

来自分类Dev

检查输入以查看用户是否输入了control -d

来自分类Dev

检查用户输入是否输入了重复的数字

Related 相关文章

  1. 1

    C编程:如何检查用户是否仅在以下表达式中输入了数值?

  2. 2

    以下表达式如何在python中工作?

  3. 3

    Python-如何对以下表达式求值?

  4. 4

    如何在Java中的以下表达式中获取值

  5. 5

    C ++中的魔术具有以下表达式x = y-x +(y = x)

  6. 6

    以下表达式做什么?

  7. 7

    如何检查C中的表达式是否恒定?

  8. 8

    检查用户是否输入了空白的c ++

  9. 9

    用于检查用户是否输入了四舍五入到100的值的正则表达式验证器

  10. 10

    以下表达式在scala中是什么意思?

  11. 11

    make文件中的以下表达式是什么意思?

  12. 12

    JSCS:运算符应遵循以下表达式

  13. 13

    如何检查用户是否输入了促销代码?

  14. 14

    如何检查用户是否输入了与漩涡哈希匹配的密码?

  15. 15

    如何检查用户是否输入了单个字母?

  16. 16

    如何检查用户是否在java中输入了一个符号?

  17. 17

    在C编程中检查字符串是否全为带正则表达式的字母数字

  18. 18

    仅在以用户输入开头的情况下才如何匹配正则表达式?

  19. 19

    检查用户是否输入了数字

  20. 20

    检查用户是否输入了。##美分

  21. 21

    如何以编程方式在F#中构建以下报价表达式?

  22. 22

    如何以编程方式在F#中构建以下报价表达式?

  23. 23

    如何检查整个输入字符串(用空格分隔的实数)是否与Python中的正则表达式匹配?

  24. 24

    如何使用户仅在Python程序中输入整数值

  25. 25

    如何使用PHP和正则表达式检查输入值是否正确?

  26. 26

    是否可以包装仅在C#中的表达式中使用的类型?

  27. 27

    检查用户是否仅在字符串中输入字母

  28. 28

    检查输入以查看用户是否输入了control -d

  29. 29

    检查用户输入是否输入了重复的数字

热门标签

归档