首页 > 其他分享 >初学C语言day08--字符串

初学C语言day08--字符串

时间:2023-08-02 19:33:25浏览次数:41  
标签:字符 day08 -- C语言 char 缓冲区 字符串 输入 size

字符串
字符:

字符是在计算机中以整数形式存储的,在需要显示成字符时会根据ASCII表中对应的关系,来显示对应的符号或图案
'\0' 0 空字符
'0' 48
'A' 65
'a' 97

串:

是一种数据结构,是由一组连续的若干个类型相同的数据组成,末尾有一个结束标志
对于这种数据结构的处理都是批量性的,从开始位置一直到结束标志才停止

字符串:

由字符组成的串型结构,结束标志是'\0'

字符串的存在形式:
字符数组:

char str[10] = {'a','b','c'};
由char类型组成的数组,记得为'\0'预留位置
使用的是栈内存,字符内容可以修改

字符串字面值:

"由双引号包含的若干个字符"
在末尾隐藏了一个'\0'
字符串字面值是以地址形式存在的,存储在代码段,如果强制修改字符串字面值或产生段错误
注意:相同的字符串字面值,在代码段中只会存在一份

常用形式:

字符数组[] = "字符串字面值";
char str[] = "hehe";
会自动在末尾补'\0'
注意:有两份一模一样的字符串,一份存在在代码段,另一份存储在栈内存中,因此栈内存中的可以修改

字符串的输入:

scanf %s 地址
自动在末尾添加'\0'
缺点:不能输入带空格的字符串,只能接收空格前面的字符串

char *gets(char *s);

功能:输入一个字符串
s:把要输入的字符串存储到s,可以接收带空格的字符串
返回值:返回s,作为链式调用
注意:gets接受字符串时不会检查长度,有越界的风险,所以编译器会产生使用警告

char *fgets(char *s, int size, FILE *stream);

fgets(str,10,stdin);
功能:输入size-1个字符的字符串
注意:
1、如果输入超过size-1个字符,会只保留前size-1个,并且会自动在末尾添加'\0'
2、如果输入不足size-1个字符,最后输入的'\n'也会接收成功后才结束

字符串的输出

printf %s 地址
int puts(const char *s);
功能:输出一个字符串
注意:会自动在末尾打印'\n'

输出缓冲区
缓冲区机制:

1、为了节约程序运行时间
2、为了平衡高速设备与低速设备之间的时间
程序要显示的数据内容不会立即显示到屏幕上,而是先存储到输出缓冲区中,当满足一定条件时,才会从输出缓冲区中显示到屏幕上
条件:
1、遇到'\n'
2、遇到输入语句
3、当输出缓冲区满4k
4、当程序结束时
5、fflush(stdout) 手动刷新

输入缓冲区

程序并不会直接从键盘接收输入的数据,而是当按下回车键后,先存储输入缓冲区中,然后程序才会从输入缓冲区读取数据
可能导致的后果:

1、当要读取的是整型或浮点型数据时,而输入缓冲区中的数据是字母或符号,此时会读取失败,并且该数据会继续残留在输入缓冲区中,影响了接下来的所有数据的读取

解决:根据scanf的返回值,判断是否需要清理缓冲区后重新输入,直到输入成功为止

2、虽然fgets可以指定读取size-1个字符,但是如果输入超过size-1个,多出的字符会残留在输入缓冲区中,会影响下面的输入语句

解决方法1:

先判断缓冲区是否有残留,如果有则清理
scanf("%[^ \n]");
// 读取任意类型数据并丢弃,直到遇到'\n'停止
scanf("%
c")
// 读取任意字符并丢弃

解决方法2:
清理输入缓冲区,但是只适合Linux操作系统
stdin->_IO_read_ptr = stdin->_IO_read_end;

3、先输入整数或浮点数数据,再输入字符\字符串时,'\n'会残留在输入缓冲区中,就会影响字符\字符串的输入

解决:在%c前面加空格
scanf(" %c",&ch);

标签:字符,day08,--,C语言,char,缓冲区,字符串,输入,size
From: https://www.cnblogs.com/bigflyny/p/17601575.html

相关文章

  • Kubernetes主流网络插件介绍
    一、Flannel1.1简介Flannel由CoreOS研发,使用”虚拟网桥和veth设备”的方式为Pod创建虚拟网络接口,通过可配置的后端(backend)定义Pod间的通信网络。它支持基于VXLAN和UDP的Overlay网络,以及基于三层路由的Underlay网络。    对于每一个容器而言,在加入网络时,在每个节点创建一......
  • k8s小技巧
    统计某个node上的所有podkubectlgetpods--all-namespaces-owide--field-selectorspec.nodeName=NODE_NAME统计pod在在不同机器的分布情况kubectl-ndefaultgetpods-owide-lapp="nginx"|awk'{print$7}'|\awk'{count[$0]++}END{pri......
  • 拓端tecdat|R语言代写模拟探索回归的P值
    最近关于p值讨论的爆发激发了我进行简短的模拟研究。特别是,我想说明p值如何随着效果和样本大小的不同而变化。以下是模拟的详细信息。我模拟了我的自变量的绘制: 对于每一个,我定义一个as 换句话说,对于每个效果大小,模拟绘制并出现一些错误。估计以下回归模型并观察p值。绘图和回归......
  • 【python_3】PyCharm开发工具的安装和基础使用!
    前言Python程序的开发有许多种方式,一般常见的:python解释器环境内,执行单行代码;使用python解释器程序,执行python代码文件;使用第三方IDE(集成开发工具),如PyCharm软件,开发python程序;1.下载pycharm官网:https://www.jetbrains.com/2.安装点击next:点击next:点击next:点击next:点击Install......
  • 拓端tecdat|R语言代写NYPD纽约市警察局抢劫者数据分析
    NYPD提供有关数据字典的止损和风险的数据,位于此处。这些数据从2003年到2014年不等,包含450多万的信息。包括人的年龄,性别和种族等几个变量。我写了一些R代码来清理并将数据编译成单个.RData文件。这篇文章的目的只是为了让这些干净的编译数据集可供其他人与他们自己的数据集结合......
  • 拓端tecdat|R语言代写使用马尔可夫链Markov Chain, MC来模拟抵押违约
    这篇文章的目的是将我在夜班学习的材料与我的日常工作和R相结合。如果我们有一些根据固定概率随时间在状态之间切换的对象,我们可以使用马尔可夫链 * 来模拟该对象的长期行为。一个很好的例子是抵押贷款。在任何给定的时间点,贷款都有违约概率,保持最新付款或全额偿还。总的来说,我们......
  • 在Linux下正确获取物理内存大小
    在Linux下获取内存大小,一般会使用free命令或者解析/proc/meminfo,但这两个方法都有缺点,就是得到的都是内核可分配的内存总量,这个值一般都会低于实际的物理内存,因为内核、固件等都会占用一些。想获取真实的物理内存,只能通过查询硬件信息,比如通过dmidecode,可以列出所有已安装的内存,再......
  • seaborn的详解-线性关系04
    线性关系可视化许多数据集都有着众多连续变量。数据分析的目的经常就是衡量变量之间的关系,我们之前介绍了可以绘制双变量分布的函数。然而,使用统计模型来估计两个噪声观测组之间的简单关系可能是非常有帮助的。我们在这一章中讨论的函数功能将在线性回归的框架实现。 请注意,seabor......
  • Linux网络命令与DHCP
    目录Linux网络命令与DHCP1.网络配置命令1.1ifconfig1.2IP1.2.1iplink数据链路层1.2.2ipaddr网络层1.2.3路由1.3hostname1.4route1.4.1添加指定网段路由1.4.2编译添加1.4.3删除指定网段路由1.4.4route-n查看1.5ss(socketstatistics)1.6netstat1.7ping1.8tracer......
  • AI绘画| 迪士尼风格|可爱头像【附Midjourney提示词】
    Midjourney案例分享图片预览迪士尼风格|可爱头像高清原图及关键词Prompt已经放在文末网盘,需要的自取在数字艺术的新时代,人工智能绘画已经迅速崭露头角。作为最先进的技术之一,AI绘画结合了艺术和科学,开启了一片全新的视觉探索领域。本篇文章将深入介绍AI绘画的迪士尼风格可爱......