C 语言——字符串和格式化输入/输出
一.字符串
1.char数组类型和空字符
c没有为字符串定义专门的变量类型,而是把它存储在char数组中。
将数组看成是一行中的多个存储单元,字符串中的每个字符占用一个字符,最后一个位置显示空字符\0,标记字符串的结束。因此意味着数组的单元数必须至少比要存储的字符数多1。(与字符的主要区别:"x"是由两个字符组成('x'和'\0'))
2.打印字符串
#include<stdio.h> int main(void) {char name[40];scanf("%s",name);printf("%s\n",name);return 0; }
%s表示打印字符串的说明符。
输入yang yang时,为什么只输出了yang而不是整个字符串呢?因为scanf()开始读取后,遇到的第一个空白字符空格、制表符或者换行符处停止读取。所以,使用%s的scanf()只会读取一个单词而不是把整个语句作为字符串读入。c使用其他读取输入函数(例如gets()来处理一般的字符串)。
3.strlen函数
上一节的sizeof运算符,以字节为单位给出数据的大小。strlen()函数以字符为单位给出字符串的长度。
#include<stdio.h> #include<string.h> #define PRAISE "what a super marvelous name!" int main(void) {char name[40];scanf("%s",name);printf("%d %d\n",strlen(name),sizeof name);printf("%d %d\n",strlen(PRAISE),sizeof PRAISE);return 0; }
输入yang yang,结果为:
4 40
28 29
string.h文件包含许多与字符串相关的函数的原型,例如strlen()。c把c函数库分成多个相关函数的系列,并为每个系列提供一个头文件。
由结果可知,strlen()报告了字符串的长度,即4和28,其中包含空格。而sizeof在数组中报告数组的大小,与字符串的长度无关。而在常量中为29,比前者多1,原因是将字符串的不可见的空字符\0也计算在内。
sizeof对于类型来说括号是必需的,对于具体量来说是可选的。不过加上会更好。
二.定义常量
- c预处理器
#define NAME value
键入大写的常量名是一个很好的习惯。它在程序头位置定义。无类型,无赋值运算符。
- const修饰符
const type name=value
它在函数中定义。相当于常量声明,需要声明类型,具有赋值运算符。
- 枚举(enum)功能
(以后再讲)
三.I/O函数
1.printf()函数
前面讲过转化说明符和参数列表,这次主要讲输出格式控制和返回值。
- 整数的字段宽度修饰符:
#include<stdio.h> #define PAGES 931 int main(void) {printf("*%d*\n",PAGES); //生成一个与要打印的整数宽度相同的字段printf("*%2d*\n",PAGES); //指示产生宽度为2的字段,但由于该整数有三位数字,故字段自动扩展以适应数字的长度printf("*%10d*\n",PAGES); //产生宽度为10即10个空格那么宽的字段,又为正数,则位于整个字段的右端printf("*%-10d*\n",PAGES); //宽度为10,且为负数,位于整个字段的左端return 0; }
输出结果:
- 浮点数的格式修饰符:
#include<stdio.h> int main(void) {const double RENT=3852.99; //以const方法定义的常量printf("*%f*\n",RENT); //原数字输出,但是根据类型的有效数字为至少六位printf("*%e*\n",RENT);printf("*%4.2f*\n",RENT); //小数点左边的数为字段宽度,右边的数为输出数字的有效数字printf("*%3.1f*\n",RENT);printf("*%10.3f*\n",RENT);printf("*%10.3e*\n",RENT); //字段宽度作用于整个数字,包括小数点;有效位数作用于指数部分printf("*%+4.2f*\n",RENT); //+标志使得数字与它的代数符号一起打印printf("*%010.2f*\n",RENT); //0标志产生前导零使得使得结果填充整个字段return 0; }
输出结果为:
- 其他格式:
#include<stdio.h> int main(void) {printf("**%d**% d**% d**\n",42,42,-42); //在说明符中使用空格以在正值之前产生一个前导空格,将使有效位相同的正值和负值以相同字段宽度输出printf("**%5d**%5.3d**%05d**%05.3d**\n",6,6,6,6); //在整数格式中,0标志使用前导零填满整个字段,而使用小数点位则要求有多少个前导零。若同时出现,则0标志被忽略return 0; }
输出结果为:
- 字符串:
#include<stdio.h> #define BLURB "Authentic imitation!" int main(void) {printf("/%2s/\n",BLURB); //扩展宽度printf("/%24s/\n",BLURB); printf("/%24.5s/\n",BLURB); //小数点位数表示只打印5个字符(从前往后)printf("/%-24.5s/\n",BLURB); //-表示左对齐输出return 0; }
输出结果为:
- 返回值
c函数一般都有一个返回值,由函数计算并返回给调用函数的值,可以用来赋值,计算和作为参数传递。总之,可以像任何值那样使用。
printf()函数返回打印的字符的数目。(一般在向文件输出而非向屏幕输出时很常用)
#include<stdio.h> int main(void) {int bph2o=211;int rv;rv=printf("%d F is water's boiling point.\n",bph2o);printf("The printf() fuction printfed %d characters.\n",rv); //针对所有的打印字符,包括空格和不可见的空字符return 0; }
输出结果:
- 打印较长字符串
方法一:使用多个printf()语句,不用\n字符结束则会紧接下一条语句;
方法二:用反斜线/和回车键组合结束第一行:
printf("No \ problem!\n"); //下一行必须从最左边开始,不能有空格或缩进
方法三:在一个双引号引起来的字符串后面跟有另外的双引号引起来的字符串,中间仅用空白字符分隔。
printf("Do you undestand" " me.\n");
2.scanf()函数
- 输入:
根据不同的说明符输入相应格式的数据,读取一个字符后保存在读取下一个字符,直到遇到空白字符(空格、制表符、换行符)或与说明符不同的数据。
c还有其他的输入函数,例如gets()(读取包含空格的字符串)、getchar()(专门的一个读取字符)
使用scanf()函数是因为它能够读取所有不同的数据类型,用途广泛。
- 返回值
scanf()函数返回成功读入的项目的个数,若没有读取任何项目(当它期望一个数字而您键入一个非数字时就会发生这种情况),scanf()返回0.当它检测到“文件结尾”时,返回EOF(一般#define指令把EOF值定义为-1)。
在循环语句中,可以使用scanf()返回值来检测和处理不匹配的输入。
3.*修饰符
- printf()函数
不想事先指定而是让程序指定字段宽度,则使用*来代替数字,同时你需要使用一个参数来表示它的值。例如:%*d:参数列表中包括一个*值和一个d的值。
#include<stdio.h> int main(void) {unsigned width,precision;int number=256;double weight=242.5;printf("What field width?\n");scanf("%d",&width);printf("The number is:%*d:\n",width,number);printf("Now enter a width and a precision:\n");scanf("%d %d",&width,&precision);printf("Weight = %*.*f\n",width,precision,weight);return 0; }
输出结果:
- scanf()函数
把它放在%和说明符字母之间,使得函数跳过相应的输入项目。
int n;printf("Please enter three integers:\n");scanf("%*d %*d %d",&n);printf("The last integer was %d\n",n);
输出结果:
若程序需要读取一个文件中某个特定的列(该文件的数以统一的列排列),那么该功能将非常有用。
转载于:https://www.cnblogs.com/mutouyky/p/8280564.html
C 语言——字符串和格式化输入/输出相关推荐
- c语言格式化输入字符型,C语言——字符串和格式化输入/输出
今天,学习了C Primer Plus的第四章.本章讲解了一些简单的C预处理器的知识,一些字符.字符串以及数组等相关概念以及输入输出函数的使用. 现将知识点总结如下: 字符串:一个或多个字符的序列(双 ...
- C语言字符串0x,0X04 字符串跟格式化输入/输出
0X04 字符串和格式化输入/输出 字符串(character string)就是一个或多个字符的序列.如:"hello world",双引号不是字符串的一部分,而是通知编译器,这 ...
- 第4章 字符串和格式化输入/输出
学习笔记--<C Primer Plus> 第4章 字符串和格式化输入/输出 4.1 前导程序 4.2 字符串简介 4.2.1 char 类型数组和 null 字符 4.2.2 使用字符串 ...
- C语言基础之4:字符串和格式化输入/输出
Tips1 函数:strlen() 关键字:const 字符串 如何创建.存储字符串 如何使用strlen()函数获取字符串的长度 用C预处理器指令#define和ANSIC的const修饰符创建符号 ...
- 第五 字符串和格式化输入/输出
C语言学习栏目目录 目录 1.前导程序 2.字符串简介 3 常量和C预处理器 这篇介绍下列内容: 函数:strlen() 关键字:const 字符串 如何创建.存储字符串 如何使用strlen()函数 ...
- C语言学习(四)字符串和格式化输入/输出
程序清单4.1 talkback.c程序 // talkback.c -- 演示与用户交互 #include <stdio.h> #include <string.h> // ...
- c语言中使用的字符常量 其起止标记,C Primer Plus学习笔记(三)- 字符串和格式化输入/输出...
从一个简单的例子开始 #include int main() { char name[10]; printf("Input Your Name:\n"); scanf(" ...
- c++ 数组的输入遇到特定字符停止输入_C语言 第4章-字符串和格式化输入/输出
#include 用数组name储存字符串,name数组有40个字节,每个字节储存一个字符值. 在scanf()函数中,输入字符串name没有&前缀. C预处理器把字符常量DENSITY定义为 ...
- C语言sscanf()函数(从字符串读取格式化输入,提取需要的信息)
需包含头文件:C 标准库 - <stdio.h> 文章目录 描述 声明 参数 返回值 实例 我在VS上测试(VS上要用sscanf_s) 示例1 示例2(提取时能默认以空格分割) 描述 C ...
最新文章
- php模拟post上传图片,php模拟post上传图片解决方法
- Java的List排序
- 《Windows Communication Foundation之旅》系列之一
- UA MATH566 统计理论8 用Pivot构造置信区间
- 计算机音乐刚好遇见你乐谱,刚好遇见你曲谱_刚好遇见你乐谱
- cpuz北桥频率和内存频率_DDR4的内存频率是如何计算的?
- 机器学习手动撸代码系列3-感知机
- c++中algorithm头文件、STL库简介及使用说明
- jquery去掉数组最后一个元素_从数组中删除最后一项
- 无法复制winevt中的文件_u盘文件无法复制怎么解决 u盘文件无法复制解决方法【详细步骤】...
- pytorch入门使用
- [转]Sublime Text 2 C++编译运行简单配置
- 三相pmsm矢量控制仿真模型_实时控制系统的时序模型及其在AUTOSAR系统仿真监控中的应用-Foundations4.1控制理论...
- gerrit配置replication插件
- SpringBoot+zk+dubbo架构实践(一):本地部署zookeeper
- 高等数学(第七版)同济大学 习题4-1 个人解答
- vue后台管理框架配置vux记录
- 算法学习——K近邻算法
- tcpdump进行IP抓包
- 【Apache Spark 】第 2 章下载 Apache Spark并开始使用
热门文章
- 嵌入式视觉领域的机器学习
- 机器学习基础-数据降维
- 这12大管理原则,经营者必知
- 一份关于kaggle特征构建技巧和心得
- 知乎李大海:AI 不只是噱头,满足需求才是真落地
- 学 AI 和机器学习的人必须关注的 6 个领域
- 干货回顾丨机器学习笔记-----AP(affinity propagat)算法讲解及matlab实现
- (深入理解)matplotlib的交互模式(block,interactive,ion,ioff,draw,show,plot等的区别)
- 2021 年不可错过的 40 篇 AI 论文,你都读过吗?
- FPGA的历史、现状和未来