文章标题



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

/* 作者注:
   语法篇的重点是学习语法,至于scanf/gets这些函数并不重要;将来再学完语法之后,
   你不太可能再需要这些函数了,因为真正的项目一般都不是控制台这样的黑窗口程序。
   所以在这里提供了一些函数,大家直接调用就行了,只是为了方便练习。

   注:VS2013,2015下面把gets换成gets_s就行了,详情看《常见问题汇总》

   注:这6个函数采用"先声明后定义"的方式,函数体在main()的后面呢,相关语法请参考
   视频8.6讲的内容。
*/

// 去除头尾的空白字符, 返回一个C风格字符串指针
// 注: 不创建新的buffer,不作内存拷贝和移动
// 如果长空为零,则返回NULL
char* AfTrim(char* src);

// 输入一个字符串, 存到output里(左右的空白字符会被自动去掉)
char* AfGetString(char* output);

// 获取一个整数, 如果输入为空则返回默认值defValue
int AfGetInt(int defValue);

// 获取一个小数, 如果输入为空则返回默认值defValue
double AfGetDouble(double defValue);

// 获取单字符输入, 如果输入为空则返回默认值defValue
char AfGetChar(char defValue);

// 获取bool型输入, 如果输入为空则返回默认值defValue
bool AfGetBool(bool defValue);



struct User
{
    int id;
    char name[128];
    char phone[32];
    bool vip;
};

int main()
{
    User u;
    u.id = AfGetInt(0);
    AfGetString(u.name);
    AfGetString(u.phone);
    u.vip = AfGetBool(true);

    system("pause");  // 加上这么一行, 则需要按回车后才能退出
    return 0;
}


/* 从控制台输入各种类型的数据示例 
   语法篇18章后可以完全不用scanf,直接使用这一套API
*/

// 去除头尾的空白字符, 返回一个C风格字符串指针
// 注: 不创建新的buffer,不作内存拷贝和移动
// 如果长空为零,则返回NULL
char* AfTrim(char* src)
{
    char* pStart = NULL;
    char* pEnd = NULL;
    char* p;

    // 从第1个字符开始扫描
    for(p=src ; *p != '\0'; p ++ )
    {
        if(*p == ' ' || *p == '\t' || *p== '\n')
            ;   
        else
        {
            pStart = p; // 开头
            break;
        }
    }
    // 全部为空白字符
    if(pStart == NULL) 
    {
        *src = '\0';
        return src ;
    }
    // 继续扫描
    bool nonBlank = true;
    for( ; ; p ++ ) 
    {
        if(*p == ' ' || *p == '\t' || *p== '\n' ||*p=='\0')
        {
            if(nonBlank)
            {
                pEnd = p;
                nonBlank = false;
            }
            if(*p == '\0') break;
        }
        else
        {
            nonBlank = true;
        }
    }

    // 截断末尾的空白
    *pEnd = '\0'; 

    // 有效长度为0,返回空指针
    if(pEnd == pStart) return NULL;

    return pStart; 
}

// 输入一个字符串, 返回接收到的长度
char* AfGetString(char* output)
{
    char buf[512];
    gets(buf);
    char* str = AfTrim(buf);
    if(str == NULL) 
        return NULL;
    else
    {
        strcpy(output, str);
        return output;
    }
}

// 获取一个整数
int AfGetInt(int defValue)
{
    char buf[128];
    char* str = AfGetString(buf);
    if(str == NULL)
        return defValue;
    else
        return atoi(str);
}

// 获取一个小数
double AfGetDouble(double defValue)
{
    char buf[128];
    char* str = AfGetString(buf);
    if(str == NULL)
        return defValue;
    else
        return atof(str);
}

// 获取单字符输入
char AfGetChar(char defValue)
{
    char buf[128];
    char* str = AfGetString(buf);
    if(str == NULL)
        return defValue;
    else
        return str[0];
}

// 获取bool型输入
// 获取单字符输入
bool AfGetBool(bool defValue)
{
    char buf[128];
    char* str = AfGetString(buf);
    if(str == NULL)
        return defValue;
    else
    {
        if(strcmp(str, "YES") == 0
            || strcmp(str, "yes") == 0
            || strcmp(str, "1") == 0
            || strcmp(str, "true") == 0
            || strcmp(str, "TRUE") == 0)
            return true;
        return false;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值