标题:关于检查输入不合法的问题,请大牛们赐教
只看楼主
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
结帖率:97.5%
已结贴  问题点数:20 回复次数:20 
关于检查输入不合法的问题,请大牛们赐教
一个程序的健壮性测试,用户随意输入值程序不出错就达到了目地。第一份代码是用字符串处理,可以完整的控制用户的所有输入不合法的情况。第二份代码是用输出流控制。但是不管怎么处理也没有字符串处理的好。比如输入1.0,+1,1+这些值的话还输会判定为合法的输入。因为scanf返回值会有0,和1。

我想知道不用字符串能完整处理好输入数字的方式。假如一个结构体有int float double char,各种类型的话。都用字符串处理的话那好麻烦,而且全是char型感觉也不美观,那不然其他类型的常量还有啥用呢?请大牛赐教!!!


代码1:
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main ()
{
    char str[100];
    while(1)
    {
        gets(str);
        if(strlen(str) ==1  && str[0] >= 49 && str[0] <= 57 && str[0] != '.')
        {
            printf("输入合法\n");
            //putchar(str[0]);
            int c = atoi(str);
            printf("%d\n", c);
        }
        else
        {
            printf("input error! iNput again\n");
        }
    }
}


代码2:
程序代码:
#include<stdio.h>
#include<stdlib.h>

int main()
{
    int a, b, c;
    while(1)
    {
    c = scanf("%d", &a);
    printf("%d  ", c);
    if (c == 1 &&c != 0 )
    {
        printf("YES\n");
        fflush(stdin);
    }
    else
    {
        fflush(stdin);
        printf("error!\n");
        continue;
    }
    }
}
搜索更多相关主题的帖子: 而且 字符串 结构体 double 
2017-04-07 11:32
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:4 
说了那么多的话,可还是没告诉大家你想完成什么功能。
(顺便说一下你的两段代码,第一段中gets已经废弃很多很多年了;第二段代码中fflush(stdin)正是一个“未定义行为”的例子。当然,这些都不重要,重要的是 无法从你的代码中猜出你想实现什么功能)
2017-04-07 12:12
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
回复 2楼 rjsp
我想写个链表。处理用户不合法的输入导致程序出错的问题。求指教
2017-04-07 12:31
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用Emotiona在2017-4-7 12:31:17的发言:

我想写个链表。处理用户不合法的输入导致程序出错的问题。求指教

我来举个例子,比如:
    “合法”的定义是,一行之内,除了空白字符外,有且只有一个'0'至'9'的字符,例如
     "  5    " 合法
     "5    " 合法
     " 5" 合法
     "5" 合法
     "5 5" 不合法
     "." 不合法
2017-04-07 12:49
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
是这样的。只有用字符串处理?还有就是姓名,学号,成绩等。用户随意输入也会导致程序出错。难道只有全部用字符串输入,再转整形浮点型?
2017-04-07 12:59
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:4 
只要你的程序中有scanf() 和gets(),那么你的程序就不存在所谓的健壮性。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-07 13:04
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用Emotiona在2017-4-7 12:59:29的发言:

是这样的。只有用字符串处理?还有就是姓名,学号,成绩等。用户随意输入也会导致程序出错。难道只有全部用字符串输入,再转整形浮点型?
听不懂,scanf不就是干这个的吗?
2017-04-07 13:21
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
得分:4 
接收字符串,然后用正则表达式判断。
2017-04-07 13:48
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
回复 6楼 renkejun1942
不用系统输入函数,拿别人的写的软件怎么处理。
2017-04-07 14:01
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
回复 8楼 grmmylbs
大神有没有实例学习。
2017-04-07 14:07



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-475861-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.142411 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved