本文适用于大学的期中期末考试、专升本(专接本、专插本)考试、408等考研预科。如有相关题目疑问或建议欢迎在评论区进行互动。
转载请标明出处。
在介绍C的三种基本结构之前,我们首先来逐字逐句的解析一些代码语句,以便更好地上手并学习接下来的内容。
此处介绍C的最经典代码案例:Hello world!
#include<stdio.h> //编译预处理,程序包含头文件stdio.h
int main() //定义一个整型类型的主函数main()
{
printf("Hello world!"); //在屏幕上打印Hello world!
return 0; //返回值,返回的状态码被用来表示函数执行的顺利与否(-1和0就是最常用的状态码)
}
在这段代码中,我们注意到一下几点:
编写C代码需要添加头文件以使用相应头文件所包含的函数
此代码中用到了printf库函数,故要编译包含printf所在的头文件stdio.h
定义一个整型类型的主函数main(),将其所包含的语句用花括号括起来
此处打印(输出)的语句为:printf("格式控制");
C的每条语句必须以分号结尾
由void定义的函数,不需要return返回值,而其他定义的函数(如此处的int),则需要返回一个状态码,通常这个状态码为0或-1
C语言中注释语句有两种方式
//只能进行单行注释
/*可以进行多行注释*/
我们可以对他进行一些改动:
#include<stdio.h>
int main()
{
int count = 0; //定义一个整型计数器并赋初值,用于循环计数
int maxOutputs = 2; //定义循环的最大次数
for (count = 0; count < maxOutputs; count++) //循环结构
{
if (count == 0) //选择结构:判断是否为第一次输出
{
printf("Welcome to C programming!\n"); //输出句尾的\n为换行符
}
printf("Hello world!\n");
} //使用顺序结构输出结束语
printf("Goodbye!\n");
return 0;
}
程序首先包含了
stdio.h
头文件,这是因为我们需要使用printf
函数来输出文本到控制台
定义了两个整型变量
count
和maxOutputs
。count
用于跟踪循环的次数,maxOutputs
定义了 "Hello, World!" 需要被输出的次数
使用 for 循环作为循环结构,循环体将执行两次,由 count 从0开始,直到小于 maxOutputs
在循环体内,首先使用 if 语句作为选择结构来判断是否是第一次循环。如果是,就输出额外的欢迎信息
无论是否为第一次循环,都会执行
printf("Hello, World!\n");
来输出 "Hello, World!"
循环结束后,使用顺序结构输出结束语 "Goodbye!"
在这个代码中共用到了顺序、选择、循环三种结构,即C语言的三大基本结构。现在我们就来详细了解一下这一章的内容。
顺序结构
顺序结构是指程序按照代码的书写顺序从上到下依次执行,且每条语句必须执行并只执行一次。 接下来我们将从输入、输出语句中切实感受顺序结构的精髓所在。
输入语句
在第一章的学习中,我们提到了一个算法具备五种特点,且程序=数据结构+算法,故而程序同样具备其中的某些特点,如有零个或多个输入、一个或多个输出。
其中输入语句我们常常用以下句式来实现:
scanf("格式控制",地址表列); //其目的是将键盘上输入的数据赋给指定的变量
内部的格式控制往往包含三个字符类型,即转换说明符,转义字符,普通字符。
转换说明符(允许程序员在执行输入和输出操作时指定期望的格式):
%d:用于输出或输入一个十进制的整数(
int
类型)。%i:与
%d
类似,用于输出或输入一个十进制的整数。%u:用于输出或输入一个无符号十进制整数(
unsigned int
类型)。%o:用于输出或输入一个八进制整数(
int
类型)。%x:用于输出或输入一个十六进制整数(小写字母,
int
类型)。%X:用于输出或输入一个十六进制整数(大写字母,
int
类型)。%c:用于输出或输入一个字符(
char
类型)。%s:用于输出或输入一个字符串(
char
数组或char
指针)。%f:用于输出或输入一个浮点数(
float
或double
类型)。%e:用于输出或输入科学计数法格式的浮点数(
float
或double
类型)。%E:与
%e
类似,但使用大写字母 'E' 表示指数。%g:用于输出浮点数,根据数值的大小自动选择
%f
或%e
。%G:与
%g
类似,但使用大写字母 'E' 或 'e'。%a:用于输出十六进制或八进制浮点数(C99标准引入)。
%A:与
%a
类似,但使用大写字母表示。%n:不输出任何内容,但更新一个变量,表示到目前为止在输出中写入的字符数。
%%:输出一个百分号字符
%
。
转义字符(用于表示那些在键盘上无法直接输入的控制字符,或需要特殊格式的输出):
\n
- 换行符:将光标移动到下一行的开头。
\t
- 制表符(水平):将光标移动到下一个水平制表位(tab位),通常是8个字符的位置。
\v
- 垂直制表符:将光标移动到下一个垂直制表位。
\b
- 退格符:光标后退一个位置,不常用。
\r
- 回车符:将光标移动到当前行的开头。
\f
- 换页符:相当于形式上的换页,类似于打印机的换页。
\a
- 响铃符:在某些终端上产生响声。
\'
- 单引号:用于在字符串中包含单引号字符。
\"
- 双引号:用于在字符串中包含双引号字符。
\\
- 反斜杠:用于在字符串中表示一个反斜杠字符。
\?
- 问号:在某些上下文中,如printf
的格式字符串中,可以作为特殊字符使用。
\ooo
- 八进制转义序列:以\
开头,后跟1到3个八进制数字(0-7),表示相应的ASCII字符。例如,\041
表示字符'A'
。
\xhh
- 十六进制转义序列:以\x
开头,后跟两个十六进制数字,表示相应的ASCII字符。例如,\x41
表示字符'A'
。
普通字符:除转换说明符、转义字符以外的字符,在printf函数输出时按原样输出。
值得注意的是,转换说明符在进行输入的格式控制时,还常常有以下几种用法:
%md:指定输入数据的宽度为m列。
%*md:输入项在读入后有m列不赋值给相应的变量。
以上只能用于整型、指定整型的变量。
其中m > 0:右对齐,即末位往左;m < 0:左对齐,即首位往右。
地址表列往往格式如此:&变量名1,&变量名2,……,&变量名n
除非变量是数组、指针、字符串,否则必须使用取地址符 & 。
在整型、实型之前可以加分隔符(空格、换行)。
对于字符型变量的输入,我们往往有三种方法,其一就是仍然用scanf函数来进行实现。
举个例子:
#include <stdio.h>
int main()
{
char ch;
printf("请输入一个字符: ");
scanf("%c", &ch);
printf("你输入的字符是: %c\n", ch);
return 0;
}
需要注意的是,在字符型前不能加分隔符,在整型前可以加分隔符。
第二种方法在初学阶段往往不常使用,即 fgets函数。
举个例子:
fgets函数可以读取一行字符串,我们利用其从这个字符串中提取第一个字符:
#include <stdio.h>
int main()
{
char str[100]; //确保数组足够大以存储一行输入
char ch;
printf("请输入一个字符: ");
if (fgets(str, sizeof(str), stdin))
{
ch = str[0]; //假设用户至少输入了一个字符
printf("你输入的字符是: %c\n", ch);
}
return 0;
}
使用 fgets函数 时,需要提供一个字符数组来存储输入的字符串。函数的第二个参数是数组的大小,以防止缓冲区溢出。 fgets函数 会读取直到遇到换行符或达到最大字符数为止的输入,并包括换行符在内。
通常,字符型变量有其自己的输入方法,即字符输入函数:
getchar();
使用时如下:
char ch;
ch = getchar();
printf("%c", ch);
可能有同学就会发现,为什么这里还用printf函数来输出呢,难道字符型变量没有自己的输出函数吗?当然有,但在介绍之前我们还是需要从printf函数开始说起。
输出语句
在C语言中,我们常常使用printf函数来进行某一数据的输出,和scanf函数一样都需要使用编译包含printf、scanf库函数所在的头文件stdio.h,即:
#include<stdio.h>
其printf函数的格式如下:
printf("格式控制",输出表列); //其目的是向终端输出数据
输出语句的格式控制雷同于输入语句,这里不再赘述。
类似于输入语句,输出语句的转换说明符在进行输出的格式控制时,同样有以下几种用法:
%md:以宽度m列输出。
%m.ns:取字符串中左端的n个字符按m列输出。
%m.nf:以宽度m列,小数点后保留n位输出,m可以省略不写,省略时小数点前原样输出;
当m和n都省略不写时,小数点后输出六位,不足的自动补齐。
其中m > 0:右对齐,即末位往左;m < 0:左对齐,即首位往右。
举个例子:
#include <stdio.h>
int main()
{
// 定义一些示例变量
int integerVar = 123;
int width = 10;
float floatVar = 3.1415926;
char charVar = 'A';
double doubleVar = 1.6180339;
char stringVar[] = "Hello, World!";
// 普通整数输出
printf("普通整数输出: %d\n", integerVar);
// 带宽度的整数输出(宽度为10)
printf("带宽度的整数输出: %10d\n", integerVar);
// 右对齐的整数输出
printf("右对齐的整数输出: %-10d\n", integerVar);
// 浮点数输出,指定小数点后位数
printf("浮点数输出: %.2f\n", floatVar);
// 科学计数法输出浮点数
printf("科学计数法输出: %.2e\n", floatVar);
// 指定宽度和精度的浮点数输出
printf("指定宽度和精度的浮点数输出: %10.3f\n", floatVar);
// 双精度浮点数输出
printf("双精度浮点数输出: %Lf\n", doubleVar);
// 带前缀的八进制数输出
printf("带前缀的八进制数输出: %#o\n", 17);
// 带前缀的十六进制数输出
printf("带前缀的十六进制数输出: %#x\n", 255);
// 带前缀的十六进制数输出(大写)
printf("带前缀的十六进制数输出(大写): %#X\n", 255);
// 字符输出
printf("字符输出: %c\n", charVar);
// 字符串输出
printf("字符串输出: %s\n", stringVar);
// 使用%ld输出长整型,假设有long int longVar = 1234567890;
// printf("长整型输出: %ld\n", longVar);
// 使用%lu输出无符号长整型,假设有unsigned long int ulongVar = 1234567890;
// printf("无符号长整型输出: %lu\n", ulongVar);
// 使用%s输出日期,假设有struct tm *timeptr;
// printf("日期输出: %s\n", asctime(timeptr));
return 0;
}
其输出的结果为:
输出表列的格式为:输出项1,输出项2,……,输出项n
其中需要注意的是:
- 输出项可以是常量、变量名、表达式
- 说明符必须与输出项一一对应(类型需匹配)
- 当输出项的个数大于与之对应的说明符时,舍弃多余的输出项
在输出函数中,同样存在字符输出函数,即:
putchar(输出项);
举个例子:
char ch = 'a';
putchar('B'); //输出字符常量B
putchar(ch); //输出字符变量a
putchar(65+1); //输出的表达式结果:B(B的ASCII码为66)
而以上三条语句其实就等价于:
printf("%c,%c,%C",'B',ch,65+1);
《衡庐浅析·C语言程序设计·第三章·三种基本结构之顺序结构》部分到这里就结束了,我会在后续章节编写一些题目或分享一些典型的例子以巩固所学的知识点。下一个知识点章节我们将会学习C语言中三种基本结构之选择结构的相关知识,敬请期待,也欢迎大家在评论区进行互动!
标签:输出,函数,字符,int,C语言,衡庐,printf,浅析,输入 From: https://blog.csdn.net/m0_68962556/article/details/140249060