ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C语言基础知识(一)————各类符号的含义与输入输出库(stdio)

C语言基础知识(一)————各类符号的含义与输入输出库(stdio) 前言在编写 C 语言程序之前我们需要先导入程序运行所需的库这些库也被称为头文件。本篇基础知识将以 C 语言标准输入输出库stdio.h为例进行讲解。一、占位符与 Java 不同在 C 语言中占位符用于printf、scanf这类格式化输入输出函数用来标记数据的位置与数据类型。在printf输出时占位符所在的位置会被替换为变量的值在scanf输入时占位符则代表需要从控制台读取对应类型的数据并存入变量。C 中存在两套 IO 体系如果沿用 C 风格的printf/scanf占位符的用法和规则与 C 语言完全一致如果使用 C 原生的cout与cin流输入输出则无需占位符系统会自动识别变量的数据类型。在 C 语言中变量必须先声明后使用声明时需要指定其数据类型。数据类型决定了变量在内存中占用的字节数、取值范围以及可进行的运算。下面列出 C 语言中常见的变量类型数据类型关键字占用字节数32位系统取值范围大致短整型short2 字节-32768 ~ 32767整型int4 字节-2147483648 ~ 2147483647长整型long4 字节32位/ 8 字节64位取决于系统位数长长整型long long8 字节-9223372036854775808 ~ 9223372036854775807无符号整型unsigned int4 字节0 ~ 4294967295单精度浮点型float4 字节约 3.4e-38 ~ 3.4e38双精度浮点型double8 字节约 1.7e-308 ~ 1.7e308字符型char1 字节-128 ~ 127或 0 ~ 255字符串char[]取决于长度由字符数组存储指针void*/类型*4 字节32位/ 8 字节64位内存地址注意上表中的字节数基于常见的 32 位系统实际大小可能因编译器和操作系统而异。可以使用sizeof(类型)运算符在程序中获取某个类型实际占用的字节数。总而言之在 C 和 C 语言中占位符就是变量位置的替代品。不同变量对应的占位符如下表所示数据类型占位符说明int%d输出/输入十进制整数long%ld输出/输入长整型整数long long%lld输出/输入长长整型整数unsigned int%u输出/输入无符号十进制整数float%f输出/输入单精度浮点数double%lf输出/输入双精度浮点数scanf 中必须用%lfchar%c输出/输入单个字符char[]字符串%s输出/输入字符串void*指针%p输出指针地址short%hd输出/输入短整型整数unsigned long%lu输出/输入无符号长整型整数unsigned long long%llu输出/输入无符号长长整型整数doubleprintf 输出%e/%E以科学计数法输出浮点数doubleprintf 输出%g/%G根据数值大小自动选择%f或%e输出int八进制%o以八进制形式输出整数int十六进制%x/%X以十六进制形式输出整数小写/大写字母二、转义符在 C 语言中转义字符以反斜杠\开头其核心作用是改变紧跟在反斜杠后面的字符原本的含义。有些字符无法直接写在字符串中或者本身在 C 语言中具有特殊语法作用此时就需要借助转义符来表示。举个例子双引号是字符串的边界标记如果直接写在字符串内部编译器会误认为字符串提前结束从而引发编译错误此时使用\反斜杠会告诉编译器这个双引号只是普通字符并非字符串结束符最终就能正常输出双引号。再比如换行操作我们无法直接在双引号包裹的字符串中敲回车换行使用\n就可以实现换行功能。除了\和\n之外还有很多常用转义字符\r代表回车将光标移到当前行的开头\t是水平制表符相当于按下 Tab 键用来做文本对齐\\用来输出反斜杠本身\0是空字符作为 C 语言字符串的结束标记是字符串必不可少的终止符号。简单来说转义字符解决了两类问题一是表示无法直接输入、不可见的控制字符如换行、制表、字符串结束符等二是转义 C 语言中自带特殊含义的符号如双引号、反斜杠等让它们不再承担语法功能而是单纯作为普通字符输出。转义符含义说明\n换行将光标移到下一行开头\t水平制表符将光标移到下一个制表位相当于按 Tab 键\\反斜杠输出一个反斜杠\本身\双引号在字符串中输出双引号\单引号在字符中输出单引号\r回车将光标移到当前行开头\b退格将光标向左移动一格\f换页将光标移到下一页开头常用于打印机\a响铃发出提示音部分终端有效\v垂直制表符将光标移到下一个垂直制表位\0空字符字符串结束标志ASCII 码为 0\xhh十六进制转义输出 ASCII 码为十六进制hh的字符如\x41输出A\ooo八进制转义输出 ASCII 码为八进制ooo的字符如\101输出A注意转义符必须写在双引号或单引号内才会生效。例如printf(第一行\n第二行);会在输出时换行。三、头文件stdio.h标准输入输出库该库包含的函数有printf、scanf、fgets、fputs等。printfprintf是输出打印语句一般写法为printf(想输出的内容);。如果涉及到变量则写为printf(内容变量所对应的占位符, 变量);。下面给出几个 printf 的代码示例#includestdio.hintmain(){intage18;doublescore92.5;chargradeA;charname[]小明;// 1. 输出纯文本printf(Hello, World!\n);// 2. 输出变量占位符对应变量printf(年龄%d\n,age);// 3. 多个占位符按顺序对应多个变量printf(姓名%s成绩%.1f等级%c\n,name,score,grade);// 4. 占位符也可以直接放常量或表达式printf(两数之和%d\n,105);return0;}运行结果Hello, World! 年龄18 姓名小明成绩92.5等级A 两数之和15注意%.1f表示保留一位小数\n是换行符。占位符的数量、顺序必须与后面的变量一一对应否则输出结果会错乱。scanfscanf用来从键盘读取用户输入的数据并存储在变量中格式为scanf(变量对应的占位符, 变量);。但是使用scanf存储内容时存在一个问题如果存储的是字符串且输入中包含空格则无法存储空格后面的内容。例如#includestdio.hintmain(){chara[10];scanf(%s,a);printf(%s,a);}结果hello world hello这时候我们就可以使用一个新的函数来解决这个问题。fgetsfgets用来从输入流中读取一行字符串并存储到指定的字符数组中。与scanf不同fgets可以读取包含空格的整行内容因此更适合处理带空格的字符串输入。fgets的格式为fgets(字符数组, 最大读取字符数, 输入流);。其中第三个参数stdin表示从键盘标准输入读取数据。下面给出一个使用fgets读取带空格字符串的代码示例#includestdio.hintmain(){charname[50];printf(请输入姓名可包含空格);fgets(name,sizeof(name),stdin);printf(你输入的姓名是%s,name);return0;}运行结果请输入姓名可包含空格张三 李四 你输入的姓名是张三 李四注意fgets会把换行符一并读入字符串因此输出时会在末尾多出一个换行。如果想去掉末尾的换行符可以手动将其替换为字符串结束符\0。此外fgets最多读取最大读取字符数 - 1个字符剩余空间会自动补上\0从而避免缓冲区溢出。fputsfputs用于将字符串写入指定的输出流其基本格式为fputs(字符串, 输出流);。其中第二个参数stdout表示输出到屏幕的标准输出。与printf不同fputs既不会自动添加换行符也不会解析字符串中的占位符而是将字符串内容原样输出。因此fputs更适合用于输出无需格式化的纯文本。具体来说fputs的返回值是int类型当写入成功时返回非负值通常是 0当发生错误时返回EOF即 -1。这一特性使得fputs在需要判断写入是否成功的场景下非常实用例如在文件写入或网络传输中可以通过检查返回值来确认数据是否完整送达。此外fputs的第二个参数不仅可以是stdout还可以是文件指针如FILE *fp这意味着它同样适用于向文件写入字符串。与fprintf相比fputs不会对字符串中的%等字符做任何特殊处理因此当字符串内容本身包含大量%符号如格式化文本、日志模板时使用fputs可以避免意外的格式解析保证内容原样输出。从底层实现来看fputs会逐个字符地将字符串写入输出流直到遇到字符串结束符\0为止但并不会把\0本身写入。这意味着它非常适合处理以\0结尾的 C 风格字符串而不需要额外指定写入长度。相比之下fwrite则需要显式指定每次写入的元素大小和数量使用起来相对繁琐。因此在需要输出一整行以\0结尾的字符串时fputs是更简洁、更直观的选择。具体来说fputs的返回值是int类型当写入成功时返回非负值通常是 0当发生错误时返回EOF即 -1。这一特性使得fputs在需要判断写入是否成功的场景下非常实用例如在文件写入或网络传输中可以通过检查返回值来确认数据是否完整送达。此外fputs的第二个参数不仅可以是stdout还可以是文件指针如FILE *fp这意味着它同样适用于向文件写入字符串。与fprintf相比fputs不会对字符串中的%等字符做任何特殊处理因此当字符串内容本身包含大量%符号如格式化文本、日志模板时使用fputs可以避免意外的格式解析保证内容原样输出。#includestdio.hintmain(){charmessage[]Hello, fputs!;// 输出到标准输出屏幕fputs(message,stdout);fputs(\n,stdout);// 手动添加换行// 也可以直接输出字符串常量fputs(这是第二行内容。\n,stdout);return0;}运行结果Hello, fputs! 这是第二行内容。注意fputs不会自动换行需要手动添加\n同时它也不会解析%d这类占位符因此不适合用于输出变量值。若需要格式化输出变量应改用printf。此外fputs与fgets是一对互补函数fgets负责从输入流读取数据fputs负责向输出流写入数据。在实际开发中fputs常用于以下场景一是输出日志信息因为日志通常不需要格式化直接原样写入即可二是向文件追加内容配合文件指针可以轻松实现三是与fgets配合完成文件的逐行复制。需要注意的是fputs写入文件时不会自动添加换行符因此如果希望每条记录独占一行需要在字符串末尾手动加上\n。另外fputs与puts也有明显区别puts只能向标准输出stdout写入并且会在字符串末尾自动追加一个换行符而fputs可以指定任意输出流且不会自动换行。因此当需要向文件或其他输出流写入内容、或希望完全控制换行行为时应优先选择fputs。练习1.定义不同类型的变量并输出他们的值和所占字节数2.输入圆的半径计算并输出圆的周长和面积3.输入一个三位数将其百位十位个位分别输出1.定义不同类型的变量并输出他们的值和所占字节数在 C 语言中变量必须先声明后使用声明时需要指定其数据类型。数据类型决定了变量在内存中占用的字节数、取值范围以及可进行的运算。下面列出 C 语言中常见的变量类型数据类型关键字占用字节数32位系统取值范围大致短整型short2 字节-32768 ~ 32767整型int4 字节-2147483648 ~ 2147483647长整型long4 字节32位/ 8 字节64位取决于系统位数长长整型long long8 字节-9223372036854775808 ~ 9223372036854775807无符号整型unsigned int4 字节0 ~ 4294967295单精度浮点型float4 字节约 3.4e-38 ~ 3.4e38双精度浮点型double8 字节约 1.7e-308 ~ 1.7e308字符型char1 字节-128 ~ 127或 0 ~ 255字符串char[]取决于长度由字符数组存储指针void*/类型*4 字节32位/ 8 字节64位内存地址注意上表中的字节数基于常见的 32 位系统实际大小可能因编译器和操作系统而异。可以使用sizeof(类型)运算符在程序中获取某个类型实际占用的字节数。下面给出一个完整的代码示例演示如何定义不同类型的变量并使用sizeof运算符输出它们的值和所占字节数#includestdio.hintmain(){// 定义不同类型的变量shorts10;inti100;longl100000L;longlongll10000000000LL;unsignedintui3000000000U;floatf3.14f;doubled3.14159265358979;charcA;charstr[]Hello;int*pi;// 输出变量的值printf(short 变量 s 的值%hd\n,s);printf(int 变量 i 的值%d\n,i);printf(long 变量 l 的值%ld\n,l);printf(long long 变量 ll 的值%lld\n,ll);printf(unsigned int 变量 ui 的值%u\n,ui);printf(float 变量 f 的值%f\n,f);printf(double 变量 d 的值%lf\n,d);printf(char 变量 c 的值%c\n,c);printf(字符串 str 的值%s\n,str);printf(指针 p 指向的地址%p\n,(void*)p);// 输出各变量所占的字节数printf(\n各变量所占字节数\n);printf(short 占 %zu 字节\n,sizeof(s));printf(int 占 %zu 字节\n,sizeof(i));printf(long 占 %zu 字节\n,sizeof(l));printf(long long 占 %zu 字节\n,sizeof(ll));printf(unsigned int 占 %zu 字节\n,sizeof(ui));printf(float 占 %zu 字节\n,sizeof(f));printf(double 占 %zu 字节\n,sizeof(d));printf(char 占 %zu 字节\n,sizeof(c));printf(字符串 str 占 %zu 字节\n,sizeof(str));printf(指针 p 占 %zu 字节\n,sizeof(p));return0;}运行结果在 64 位系统上short 变量 s 的值10 int 变量 i 的值100 long 变量 l 的值100000 long long 变量 ll 的值10000000000 unsigned int 变量 ui 的值3000000000 float 变量 f 的值3.140000 double 变量 d 的值3.141593 char 变量 c 的值A 字符串 str 的值Hello 指针 p 指向的地址0x7ffd12345678 各变量所占字节数 short 占 2 字节 int 占 4 字节 long 占 8 字节 long long 占 8 字节 unsigned int 占 4 字节 float 占 4 字节 double 占 8 字节 char 占 1 字节 字符串 str 占 6 字节 指针 p 占 8 字节注意sizeof返回的是size_t类型因此使用%zu作为占位符输出。字符串str占 6 字节是因为它包含 5 个字符加上末尾的字符串结束符\0。指针的大小取决于系统位数在 64 位系统上为 8 字节在 32 位系统上为 4 字节。2.输入圆的半径计算并输出圆的周长和面积输入值并以这个值进行运算这时候我们需要用到scanf。输出周长和面积则需要我们printf和数学公式结果为3.输入一个三位数将其百位十位个位分别输出这时候我们有两种思路。第一种用数字运算采用取余整除的方式第二种用数组的方式我们可以将输入的三位数看作是一个数组然后读取即可可能有人会问了我们为什么要减去这个’0’呢我们先记住‘0’ 是字符0不是数字0。计算机内存里所有字符存的都是ASCII码。字符’0’的ASCII码是 48字符’1’的ASCII码是 49字符’2’的ASCII码是 50……字符’9’的ASCII码是 57当我们用%s读取输入123到字符数组里num[0]里面存的并不是整数1而是字符’1’它对应的ASCII码是49。如果你直接printf(“%d”, num[0])输出的会是49而不是我们想要的1。‘1’ - ‘0’ 等价于 49 - 48 1用字符减去’0’本质就是用ASCII码相减把数字字符转换成真正的整型数字。下面是不写减去’0’的代码结果总结这篇文章讲解了 C 语言标准输入输出库 stdio.h 的基础知识核心内容可总结为三部分一、占位符用于 printf/scanf 等格式化函数标记数据位置与类型。文中给出了完整对照表覆盖 int%d、long%ld、float%f、double%lf、char%c、字符串%s、指针%p等常用类型并说明 C 沿用 C 风格时规则一致。二、转义符以反斜杠 \ 开头用于表示无法直接输入的字符或转义特殊符号。表格列出了 \n换行、\t制表符、\反斜杠、双引号、\0字符串结束符等常用转义符及其含义。三、头文件 stdio.h 的四个核心函数printf格式化输出支持占位符与变量一一对应附有完整代码示例scanf从键盘读取输入但无法读取含空格的字符串fgets可读取包含空格的整行字符串更适合处理带空格的输入fputs向输出流原样写入字符串不解析占位符、不自动换行适合输出纯文本或写文件。
返回列表