| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2305 人关注过本帖
标题:写了个一个关于输入处理的头文件~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
已结贴  问题点数:20 回复次数:12 
写了个一个关于输入处理的头文件~
程序代码:
#ifndef INPUT_DATA
#define INPUT_DATA

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<ctype.h>

#define BUFF_MAX 10  //最大缓冲区

void Input_Init_DATA(void** ,size_t );      //初始化输入数据
void Input_Absorb_Buffer(char** );          //对缓冲区残留数据进行处理
int Input_Solve_Negative(char** );          //对输入负数进行处理
void Input_Free(void** );                   //释放堆空间
void Input_Catch(char* ,char** );           //异常处理


int Input_Big_Int(char** );           //输入大整数(支持输入负数)
void Input_String(void** );           //从输入字符串
int Input_Data(const void* ,void* );  //输入数据

void Input_Init_Data(void** p,size_t size)   //初始化输入数据
{
    *p=(char* )malloc((BUFF_MAX)*sizeof(char));

    assert(*p!=NULL);

    memset(*p,0,sizeof(size));
}

void Input_DATA(char** p,char** pt,size_t* length)     //对输入数据进行处理
{
    ++*length;

    if (*length%(BUFF_MAX-1)==0)
    {
        char* ps=realloc(*p,(*length+BUFF_MAX)*sizeof(char));

        Input_Catch(ps,p);

        *p=ps;

         memset(*p+*length,0,BUFF_MAX*sizeof(char));

         *pt=*p+*length-1;
    }

        ++*pt;
}

int Input_Solve_Negative(char** p)             //对输入负数进行处理
{
    int flag=0;
    int flag2=0;

    while (1)   //对负数输入进行处理
    {
        **p=getchar();

        if (**p=='+'&&flag2!=1)
        {
            flag2=1;
            continue;
        }
        else if (**p=='+'&&flag2==1)
            return EOF;

        if (**p=='-'&&flag2!=-1)
        {
            flag=!flag;
            flag2=-1;
            continue;
        }
        else if (**p=='-'&&flag2==-1)
            return EOF;

        break;
    }

    if (!isdigit(**p))
        return EOF;

    if (flag)
    {
        char buff=**p;
        **p='-';
        ++*p;
        **p=buff;
    }

    return flag;
}

void Input_Absorb_Buffer(char** p)
{
    while (getchar()!='\n');

    Input_Free(p);

    *p=strdup("");
}

void Input_Free(void** p)                  //释放堆空间
{
    if (*p==NULL)
        return ;

    free(*p);
    *p=NULL;
}

void Input_Catch(char* ps,char** p)
{
    if (ps!=NULL)
        return ;

    Input_Free(p);
    assert(1);
}

int Input_Big_Int(char** p)                //初始化数据
{
    char* pt=NULL;
    int k=0;
    size_t length=0;

    Input_Init_Data(p,(BUFF_MAX)*sizeof(char));

    pt=*p;

    k=Input_Solve_Negative(&pt);       //对输入负数进行处理

    if (*pt=='\n')
    {
        *pt='\0';
        return EOF;
    }

    if (k==EOF)
    {
        Input_Absorb_Buffer(p);
        return EOF;
    }

    do
    {
        Input_DATA(p,&pt,&length);
    }while (isdigit(*pt=getchar()));           //对输入缓冲区进行处理

    if (*pt=='\n')
    {
        *pt='\0';
        return EOF;
    }

    Input_Absorb_Buffer(p);   //对缓冲区残留数据进行处理

    return 1;
}

void Input_String(char** p)   //输入字符串
{
    char* pt=NULL;
    size_t length=0;

    Input_Init_Data(p,(BUFF_MAX)*sizeof(char));

    pt=*p;

    while ((*pt=getchar())!='\n')
        Input_DATA(p,&pt,&length);

    *pt='\0';
}

int Input_Data(const void* format,void* s)
{
    if (scanf(format,s)!=1)
        while (getchar()!='\n');

    return 1;
}

#undef BUFF_MAX

#endif  


程序代码:
#include<stdio.h>
#include"Input.h"
#include"Big_Intger.h"
int main()
{
    char* p1=NULL;
    char* p2=NULL;

    Input_Big_Int(&p1);
    Input_String(&p2);

    puts(p1);
    puts(p2);

    free(p1);
    free(p2);

    return 0;
}


很久很久以前曾经写了个字符过滤器~用正则表达式匹配输入的字符~~不过回家后的电脑找不到了~打算回校再补充~这个可以看看效果如何~

[此贴子已经被作者于2017-5-29 16:16编辑过]

搜索更多相关主题的帖子: color 
2017-05-28 23:24
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
感觉可以写个模拟scanf的输入函数~~不过还没有看可变长度参数的用法~关键是要解决scanf的安全性问题(例如输入错误可能会导致死循环等等)~这个以后再改进吧~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-29 01:20
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:10 
回复 2楼 九转星河
以scanf函数的当前原型是无法解决真正的安全性问题的。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-29 07:39
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 renkejun1942
这样啊~那我还是先放一下了~不过因为输入数据类型不匹配而引发死循环这个基本问题还是要解决一下的~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-29 10:45
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
改进了一下~现在大整数输入支持输入负数了~~主要是用于大整数运算输入处理~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-29 14:52
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10539
专家分:42927
注 册:2014-5-20
收藏
得分:10 
void Input_Absorb_Buffer(char** p)
{
    while (getchar()!='\n');

    Input_Free(p);

    *p=strdup("");
}
问问?
1、strdup函数在哪声明的?
2、while (getchar()!='\n'); 这句有可能会暂停等待输入,此时起什么作用?
2017-05-30 06:43
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 6楼 吹水佬
以下是引用吹水佬在2017-5-30 06:43:22的发言:

void Input_Absorb_Buffer(char** p)
{
    while (getchar()!='\n');

    Input_Free(p);

    *p=strdup("");
}
问问?
1、strdup函数在哪声明的?
2、while (getchar()!='\n'); 这句有可能会暂停等待输入,此时起什么作用?


strdup包含在string.h里面~意思是从堆空间分配与原字符串长度相匹配的空间(相当于复制)~之所以不用NULL代替是因为如果输入不匹配的字符串返回NULL释放空间时会出错(其实这个我也是在renkejun1942那里学回来的)

至于2、while (getchar()!='\n');
这里是吸收缓冲去残留的字符~是在不匹配的情况下调用的~就是这样~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-30 10:15
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
strduq函数将参数字符串复制到堆空间,返回指向该空间的指针。

但是注意一下这个函数并不是标准函数,虽然绝大部分编译器都实现了它。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-30 10:57
xianwei328
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2017-6-21
收藏
得分:0 
回复 楼主 九转星河
请问版主是在校学生还是已经工作了?谢谢!!
2017-06-23 21:59
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 9楼 xianwei328
大一~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-23 23:44
快速回复:写了个一个关于输入处理的头文件~
数据加载中...
 
   



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

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