IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C_编写一个从输入流读入整数的函数当这个整数是流末尾结束位置返回EOF(对应的值)/灵活的调试宏的定义和使用/C语言对齐打印(指定下限宽度) -> 正文阅读

[C++知识库]C_编写一个从输入流读入整数的函数当这个整数是流末尾结束位置返回EOF(对应的值)/灵活的调试宏的定义和使用/C语言对齐打印(指定下限宽度)

code

从K&R中改编过来

#include <stdio.h>
#include <ctype.h>
// 数值调试宏
#ifndef CXXU
#define CXXU 1

#define dprint(expr) printf(#expr " = %d @%%d\n", expr)
#define gprint(expr) printf(#expr " = %g\n", expr)
#define fprint(expr) printf(#expr " = %f\n", expr)
#define cprint(expr) printf(#expr " = %c @%%c\n", expr)
#define sprint(expr) printf(#expr " = %s @%%s\n", expr)
// #define sprint(expr) printf("\t@sprint"#expr " = %s\n", expr)

// #define sprint(expr) printf(expr)
#define sprintln(expr) printf(expr "\n")
// 直接传递变量给pprint(取地址操作包含在了宏中)
#define pprint(expr) printf(#expr " = %p &%%p\n", &expr)
#define pprint_addr(expr) printf(#expr " = %p %%p\n", expr)
// extern void func();
// extern int multiply(int a, int b);
// extern char *str_multiplier;

#endif

// int getchar(void);
// void ungetc(int);
int getint(int *pn);
int main()
{
    // int integer[10] = {};
    int integer = 0;
    int res = getint(&integer);
    dprint(res);
    dprint(integer);
}

/* getint:  get next integer from input into *pn */
int getint(int *pn)
{
    int c, sign;
    /* 利用while(isspace(c = getchar()))可以丢弃输入缓冲区中的空白符!
    同时,被用于判断的(被预读)的字符会被记录在变量c中,不会丢失. */
    while (isspace(c = getchar()))
        ;
    /* skip white space */
    /* 判断第一个非空白字符是否为数字,并且这个数组不可以是文件结束符EOF(也是一个数字),是不是正/负号 */
    // 我们假设用户输入的是构成数字的字符,那么
    if (!isdigit(c) && c != EOF && c != '+' && c != '-')
    {
        ungetc(c, stdin); /* it is not a number */
        return 0;
    }
    // 将正负号转换为正负1
    sign = (c == '-') ? -1 : 1;
    // 转化之后,后废弃正负号,并读取下一个字符
    if (c == '+' || c == '-')
        c = getchar();
    // 将数字字符序列转化处理为整数(利用0的ascii码('0'=48),做char类型的减法,将得到的值作为int值(提升),得到数字字符char对应的整形int值)
    //  pn为指针int型指针,*pn则为int型对象
    for (*pn = 0; isdigit(c); c = getchar())
    {
        *pn = 10 * *pn + (c - '0');
    }
    // 修正正负性
    *pn *= sign;
    //    至此,这个解析所得的整数就被记录在传入的参数pn中

    /*EOF的判断.*/
    // 判断本次调用getint是否恰好读完所有输入(如果不是,后面还有内容,将预读的字符打回输入缓冲区)
    if (c != EOF)
        ungetc(c, stdin);
    // 返回被解析整数(可以是多位整数)后的下一个字符
    sprintln();
    sprintln("last readed char:(it probably a white space char,so will will print it with %%d");
    dprint(c);

    // 不过主要目的是为例能够再读取到结束符(譬如键入ctrl+D (for linux)),会返回该系统下定义的EOF对应的数(一般是-1)
    //这样,调用该函数的调用者就可以通过返回值来判断是否已经接触到文件末尾了
    return c;
}

/* 测试输入:
449
last readed char:(it probably a white space char,so will will print it with %d(10 is carriage return;32 is tailing space key)
c = -1 @%d
res = -1 @%d
integer = 449 @%d

└─[130] <git:(master eecaaa7??) > ./getint
-56
测试2:
last readed char:(it probably a white space char,so will will print it with %d
c = 10 @%d
res = 10 @%d
integer = -56 @%d
┌─[cxxu@cxxuAli] - [~/cppCodes] - [2022-04-25 11:08:02]
└─[0] <git:(master eecaaa7??) > ./getint
45
测试3:
last readed char:(it probably a white space char,so will will print it with %d
c = 32 @%d
res = 32 @%d
integer = 45 @%d
测试4
└─[0] <git:(master eecaaa7??) > ./getint
7923-

last readed char:(it probably a white space char,so will will print it with %d
c = 45 @%d
res = 45 @%d
integer = 7923 @%d
*/


调试宏(打印宏)与对齐

预览效果

在这里插入图片描述

code

使用制表符对齐的效果不太稳定,使用指定下限宽度的方法可以使得长度差异较大的输出串依然可以对齐

// 数值调试宏
#ifndef CXXU
#define CXXU 1
// 修改sizeint来指定打印宽度:(注意,必须以字符串的形式修改,(数字要包裹双引号))
//负数,就是左对齐
#define sizeint__ "25"
#define sizestr__ "%" sizeint__ "s"
#define dprint(expr) printf(sizestr__ " = %d @%%d\n", #expr, expr)
#define ldprint(expr) printf(sizestr__ " = %ld @%%ld\n", #expr, expr)
#define cprint(expr) printf(sizestr__ " = %c @%%c\n", #expr, expr)
#define sprint(expr) printf(sizestr__ " = %s @%%s\n", #expr, expr)
#define gprint(expr) printf(sizestr__ " = %g\n", #expr, expr)
#define fprint(expr) printf(sizestr__ " = %f\n", #expr, expr)
// #define sprint(expr) printf("\t@sprint"#expr " = %s\n", expr)

// #define sprint(expr) printf(expr)
#define sprintln(expr) printf(expr "\n")

// 直接传递变量给pprint(取地址操作包含在了宏中)
#define pprint(expr) printf(sizestr__ " = %p &var%%p\n", "&" #expr, &expr)
// 直接打印传入的地址(指针变量)
#define pprinta(expr) printf(sizestr__ " = %p %%p (pointer:" #expr ")\n", #expr, expr)
// extern void func();
// extern int multiply(int a, int b);
// extern char *str_multiplier;

#endif
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:09:20  更:2022-04-27 11:10:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:15:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码