昨天测试一个程序的时候发现它的输出结果和书上的不一样,也和想象中的不太一样,不过代码和书上是一摸一样的。

代码附上:(C++)

#include <iostream>
using namespace std;
class listclass
{int *listptr;//指向线性表int nlen;int nelem;
public:listclass(int n=10){nelem=0;nlen=n;if(n)listptr=new int[n];elselistptr=0;}~listclass(){delete  listptr;}int elem(int n);int &elem(unsigned n){return listptr[n];//返回线性表下标为n的元素的引用}int elem(void){return nelem;}int len(void){return nlen;}int getelem(int i){if(i>=0 && i<nelem)return listptr[i];//返回下标为i的元素的值else{cout<<"下标越界"<<endl;return -1;}}void print(void);
};
int listclass::elem(int elem)//在线性表末尾添加一个元素
{if(nelem==nlen)//线性表已满{int *newptr;newptr=new int[nlen+10];for(int i=0;i<nelem;i++)newptr[i]=listptr[i];delete listptr;nlen+=10;listptr=newptr;//指向新线性表的空间}listptr[nelem++]=elem;return nelem;//返回新的元素数量
}
void listclass::print(void)
{for(int i=0;i<nelem;i++)cout<<listptr[i]<<'\t';cout<<endl;
}
int main()
{listclass list(6);//调用构造函数for(int i=0;i<5;i++)list.elem(i);cout<<"线性表的长度是:"<<list.len()<<endl;cout<<"线性表的元素个数为:"<<list.elem()<<endl;cout<<"线性表的元素为:";list.print();list.elem(3u)=100;cout<<"线性表下标为3的元素的值为:"<<list.elem(3u)<<endl;list.elem(20);list.elem(200);cout<<"现在的线性表的长度为:"<<list.len()<<endl;cout<<"现在线性表中元素的个数为:"<<list.elem()<<endl;//cout<<"12345678912345678912345678912345678123456789123456789\n";cout<<"现在线性表中的元素为:";list.print();cout<<"线性表中的最后一个元素为:"<<list.getelem(list.elem()-1)<<endl;return 0;
}

输出结果:

与这行输出有关的代码是:

void listclass::print(void)
{for(int i=0;i<nelem;i++)cout<<listptr[i]<<'\t';cout<<endl;
}
cout<<"现在线性表中的元素为:";
list.print();

咦?我用了制表符为什么最后输出的结果没有像表格一样中间的间隔是相同的呢?我查了一下平时不太注意的制表符\t,发现。。。有点东西。以例子来说明

  • 要输出的数字自己在一行时


可以注意到:要输出的元素每4个长度一组,这就相当于所制表中每个格子的长度是4,不足的后面补空格。这里的长度可以理解成数字个数,就如上面的截图所示。

规律如下:

数据后面补充的空格长度numspace=4-n%4

这里的n之前是前面元素的长度(包括要输出的数据)

注意:制表符的宽度是个可配置属性,一旦配置好以后就固定了,除非再次配置。我这里的\t的宽度是4,有些设备和编译器上\t的宽度是8,那么上面规律对应的式子就要做一点改变。

  • 汉字和要输出的数字在一行时


    cout<<"12345678912345678912345678912345678123456789123456789\n";cout<<"现在线性表中的元素为";list.print();

输出:

发现除了0之外,其他要输出的数字对应的制表符的宽度都能很直接的看出来是4,加入了汉字之后0之后的空格便不再是原来的3了,这是因为|n-4|%4中n的值变了。(我为什么要说这么智障的话,n肯定变了呀)

在UTF-8编码下(不同的编码对应的情况不同),一个汉字占3个字节,一个英文字母占1个字节。

所以对于此种情况,前面占:10(10个汉字)*3+1*4(int 型占4个字节)=34个字节;

如果按一个数字算一个长度计算的话,那么一个长度对应4个字节。

n=34/4=8.5个长度 ,numspace=4-8.5%4=3.5,即补充3.5个长度的空格。

且每个长度对应4个字节,4*3.5=14个字节,即在下一个数据输出之前有14个空内容的字节,虽然在这个例子中肉眼看到的只有2个多的长度,可能是受到前面汉字和数字宽度的影响,并不代表实际的长度。

(不知道上面那段话我这样理解对不对,接受反驳( ´▽`))

  • 汉字、符号和要输出的数字在一行时


    cout<<"12345678912345678912345678912345678123456789123456789\n";cout<<"现在线性表中的元素为:";list.print();

中文冒号:

英文冒号:

(可以看出来中文冒号比英文冒号所占字节多)

这种情况的计算过程和第二种情况相似,但要注意的是,英文标点占一个字节,中文标点占两个字节。

附:计算机中一个符号占多少字节的相关内容(来源自百度)

1、ASCII码:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个字节。

2、UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。

3、Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。

4、符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。

!!另外,我发现了一个很诡异的事情(゚o゚;;当我把最初的输出结果(文章初始代码下面的那个输出结果)复制粘贴时,它出现了这种神奇的现象:

线性表的长度是:6
线性表的元素个数为:5
线性表的元素为:0    1    2    3    4    
线性表下标为3的元素的值为:100
现在的线性表的长度为:16
现在线性表中元素的个数为:7
现在线性表中的元素为:0    1    2    100    4    20    200    
线性表中的最后一个元素为:200

第七行的01竟然分的很开,正是使用制表符\t想要的结果

不过这个点还没有搞明白!(◎_◎;)请各路大神指点迷津,以上内容有错误要帮我指出来哦~

邮箱:1308989543@qq.com  非诚勿扰 ٩(˃̶͈̀௰˂̶͈́)و

【制表符\t】你不知道的制表符\t的那些事儿~相关推荐

  1. python中横向制表符_python中制表符是什么意思

    Python中的制表符是什么? 制表符,也属于"写法是两个字符的组合,但含义上只是一个字符"的情形.它的写法是反斜杠和t字母的组合,即"\t",t取的是tabl ...

  2. python中水平制表符_python中制表符的案例分析

    python中制表符的案例分析 发布时间:2020-11-11 14:04:04 来源:亿速云 阅读:79 作者:小新 小编给大家分享一下python中制表符的案例分析,相信大部分人都还不怎么了解,因 ...

  3. linux终端制表符长度,linux+制表符

    弹性云服务器 ECS 弹性云服务器(Elastic Cloud Server)是一种可随时自助获取.可弹性伸缩的云服务器,帮助用户打造可靠.安全.灵活.高效的应用环境,确保服务持久稳定运行,提升运维效 ...

  4. mysql输出制表符_MySql使用制表符分隔插入位

    我正在使用制表符分隔的文件将数据插入MySql数据库 在位域中,我得到0和1作为值,但是当我使用下面的命令将数据插入数据库时​​,它将0转换为1. load data local infile 'c: ...

  5. python入门代码示例-Python入门100个实例(14)——换行符和制表符

    从本实例学到什么 换行符是什么,怎么写和有什么用. 制表符是什么,怎么写和有什么用. 稍稍提及转义字符的概念. 示例程序代码 #例2-3-9 换行符和制表符 print("I'm Bob. ...

  6. c语言能让制表符空9个字符码,C语言入门9-1-分类函数

    分类函数 ASCII字符能够分为英文字母.数字.控制字符.空白字符.大小写字母以及标点符号,分类是指对字符进行属性断定,判断字符属于哪些范畴,这些属性的断定在程序中很是常见,尤为是通讯协议的字符处理部 ...

  7. c语言水平制表符怎么才能占16列,水平制表符是?其作用?

    水平制表符就是按键Tab. 作用是:按一次tab键,光标就自动定位到下一个制表符的位置,而且在一个制表符宽度范围内,增加或者删除文字不会影响下一制表符中的文字位置. 制表符(也叫制表位)的功能是在不使 ...

  8. Python中制表符\t的使用

    以前一直以为制表符只是输出八个空格,实际上是补齐8个字符位置的倍数的. 如果字符只有一到七个,则补齐缺的位数,比如输出两个字符再输出制表符,此时制表符输出6个空格.如果输出8个字符,此时制表符输出8个 ...

  9. python制表符的作用_Python制表符是什么

    通过之前的学习,相信大家对Python已经有了初步的了解.今天跟大家介绍下Python制表符. 什么是Python中的制表符呢? 制表符,也属于"写法是两个字符的组合,但含义上只是一个字符& ...

  10. python里制表符是什么_Python制表符是什么

    通过之前的学习,相信大家对Python已经有了初步的了解.今天跟大家介绍下Python制表符. 什么是Python中的制表符呢? 制表符,也属于"写法是两个字符的组合,但含义上只是一个字符& ...

最新文章

  1. Servlet--05--HttpServletRequest; HttpServletResponse
  2. JavaSE基础知识(5)—面向对象(5.2类的成员)
  3. 产品经理如何激发出新的创意
  4. 2月上旬全球六大顶级域名最新动态 .COM占73.3%
  5. IOS绘制小黄人,对绘图知识的一个练习
  6. 10+ 最佳的 Node.js 教程和实例
  7. 期权数据 获取_我如何免费获得期权数据
  8. Datatables 构建响应式
  9. win10编译caffe跑faster-rcnn(cuda7.5)
  10. PDF文件的加载及展示
  11. 【深度学习-花书】第二章 线性代数
  12. 按学号查找学生信息 用c语言表达,学生信息管理系统C语言编程.docx
  13. CAD中插入外部参照字体会变繁体_什么是CAD的形文件,它与字体文件有什么区别?...
  14. java 时间格式 外语,java-如何使用ERA设置日语的英语日期格式
  15. ❤️大学三年沉淀,把我的学习经验分享给你,爆肝万字带你走进编程世界!❤️
  16. 资讯_计算机屏幕_镜面屏;
  17. 【附源码】Python计算机毕业设计社区生鲜电商平台
  18. 如何快捷的修改html,问如何通过F12键来快捷的修改网页
  19. 华为软件开发云如何为数字经济时代赋能?
  20. 从零认识 无标度网络

热门文章

  1. 技术人频道的一个问题——“程序员言”
  2. 【数据结构】线性表的链式存储结构
  3. vmware+player+12+linux,Vmware player 12
  4. springsecurity登出的配置信息以及登出的认证效果
  5. python闹钟界面程序_利用QT写一个极简单的图形化Python闹钟程序
  6. IntelliJ IDEA 2019.1 EAP5 发布,Maven 构建输出统一查看
  7. GPS Programming Tips for Windows Mobile
  8. 设计模式学习之外观模式
  9. 字符串匹配(KMP)算法及Java实现
  10. 转:Scrapy(爬虫框架)入门教程