C语言基础——认识C语言(三)

2023-03-30 00:00:00 字符串 循环 结构 字符 注释
序文
欢迎阅读  霖海岛LHaisland  原创的C语言合集的第三篇文章,本文字数为3222字,全文阅读需要约14分钟。由于笔者能力有限,如有疏漏或错误的地方,希望读者朋友们不吝斧正,谢谢大家。
上篇文章地址:C语言基础——认识C语言(二)
本文我们将介绍字符串、转义字符、注释、选择结构、循环结构的基础知识。
四、字符串、转义字符、注释
  1. 字符

我们在键盘上敲出来的所有东西都可以理解为字符,字符一般用单引号‘ ’来表示。

如图所示,以字符形式定义a为'B',以字符形式(%c)打印a,结果为B

以字符形式定义b为97,以字符形式(%c)打印b,结果为a

这是为什么呢?

这里我们需要引入ASCII码表来解释

字符型(char)用于储存字符(character),如英文字母或标点。严格来说,char 其实也是整数类型(integer type),因为 char 类型储存的实际上是整数,而不是字符。
所以我们以字符形式定义的97也对应着ascii码表中的a。

2.字符串
"Hello world\n"
这种由双引号引起来的一串字符称为字符串字面值(String Literal),简称字符串。
注:字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候 \0是结束标志,不算作字符串内容。
因为在数据类型的时候我们强调过:
C语言本身并没有字符串类型,我们在C语言程序中使用的字符串实际上是字符数组,即多个字符构成的就是字符串!
所以当我们需要存放字符串时,需要将字符串存入数组中,并且将字符串用双引号引起来。
这里我们以字符形式定义一个arr数组,存放字符串abc,然后以输出字符串(%s),示例如下。

所以,我们需要知道的是——字符串的本质就是一个字符数组


下面让我们看一下\0的作用:

这里arr1数组输出的结果显然是我们不想得到的。

这里我们需要引入strlen来解释,strlen也是一个库函数,当需要调用strlen函数时,需要引入#include<string.h>。

strlen函数的定义是:strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

strlen函数的作用是:计算给定字符串的长度。

所以这里我们可以发现,数组arr和数组arr2的结果是我们可以理解的,那为什么数组arr1给我们的结果是15呢?
因为字符数组arr在内存中的实际存放情况为:a b c '\0',后面的'\0'是编译器自动加上的,所以在给字符串数组赋初值的时候不用指定数组的长度。
用单引号赋值时,会丢失'\0',所以此时字符串数组无结束标志,打印时后面会出现乱码。

所以当我们用单引号赋值时,strlen检索到了a、b、c,但是没有检索到\0,会依然在内存中继续检索,直到遇到\0才停止检索并输出结果。



3.转义字符
思考,以下这个地址可以直接输出吗?
#include<stdio.h>int main(){  printf("D:\test\test");  return 0;}
输出结果如下:

但当我们运行之后,发现我们并不能输出我们的路径,这是为什么?因为这里\和其他字符构成转义字符。

转义字符(Escape character),所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。而C语言中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了


注:转义字符仍然被算作一个字符。

思考:以下代码段的输出结果是多少?
#include<stdio.h>int main(){  printf("%d\n", strlen("D:\test\321\test.c"));  return 0;}
结果为13

4.注释
C语言有两种注释

种:

/*这是一个经典注释,C89标准引入*/,这种类型的注释也叫做块注释

第二种:

//这是一个单行注释,C99标准引入,这种类型的注释也叫做行注释

注释原则

1.项目开发中,尽量保持代码注释规范和统一。

2.注释方便了代码的阅读和维护。

3.边写代码边注释,修改代码时要相应修改注释,保证注释和代码的一致性。

4.注释要简洁明确,不要出现形容词。

5.通过注释可以快速知道所写函数的功能,返回值,参数的使用。

笔者更推荐注释时使用第二种注释方法,因为种注释方法不能嵌套,/* 总是与近的一个 */ 匹配。



在C语言程序中一共有三种程序结构:顺序结构、选择结构(分支结构)、循环结构。


五、顺序结构

顺序结构是简单的程序结构,也是常用的程序结构,只要按照解决问题的顺序写出相应的语句即可,它的执行顺序是自上而下,依次执行。

我们之前所有的代码段均为顺序结构,这里不再赘述。


六、选择结构(分支结构)

在介绍选择结构之前,我们先简单了解一下scanf函数。

scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include<stdio.h>。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
示例:

这里读者不必理解如何使用指针,只需要记住以下两条简单的规则:

如果用scanf()读取基本变量类型的值,在变量名前加一个&。
如果用scanf()把字符串去读到字符数组中,不要使用&。
对于scanf函数的内容使用规则并不少,这里只做简单了解,未来会详细展示。
这里说一下对于scanf函数的注意事项:

如果你使用的是较新版本的Visual Studio(VS2019就有这个问题),scanf函数会被认为是不安全的,编译器会抛出C4996错误,并建议你使用别的安全函数(scanf_s)替代。

但是,笔者不建议引入scanf_s,在C语言中scanf_s不是C语言标准规定的,这个scanf_s只是VS编译提供的。因为这是VS特有的,其他的编译器并不支持这种格式,所以并不适合进行代码迁移。

你可以认为scanf_s就是为%s而生的,我们目前并不需要引入讨论这个问题。

请将#define _CRT_SECURE_NO_WARNINGS 1加入预定义字符串,屏蔽不安全函数错误。

这也是为什么笔者之前的每一次代码截图都是从第二行开始的。

但是每一次写代码都需要加入这段预定义字符串,非常麻烦,一劳永逸的办法如下:

首先找到VS安装文件,找到newc++file.cpp文件。因为版本不同,安装路径不同等等,newc++file.cpp文件位置不一样。所以我就不具体细说了。


在你安装VS2019的位置,寻找newc++file.cpp并且打开,将#define _CRT_SECURE_NO_WARNINGS 1复制并粘贴并保存,这样以后每一次新建工程就会自带这一段定义字符串了。

下面我们言归正传,开始简单地介绍选择结构:

示例(if-else):

解释:用户自行输入a的值,如果a大于等于1,则输出"做";反之a小于1,则输出"不做"。

示例(if嵌套):

解释:用户自行输入a的值,如果a在60~100区间内,则继续进行判断,输出对应的结果,如果不在60~100区间,则跳到else直接输出。

在这里补充一点:C语言中规定,1为真(TRUE),0为假(FALSE)。

示例:


在这里不做过多解释,只作简单了解即可,本章节为认识C语言,目的是让读者朋友们能够简单看懂C语言代码为了以后的展开做铺垫,笔者在完结认识C语言这一章节后,就会详细的展开分支与循环结构,到时会详细的对这两种结构进行分析。

七、循环结构

循环三要素:

  • 循环初始操作

  • 循环条件

  • 循环体

对于任何循环通常后两个要素中至少有一条语句使循环条件趋向假使得循环能够结束。同时,循环结构就是在给定的循环条件成立的情况下,重复执行一个程序段;而当循环条件不成立时,则退出循环。


循环结构的三种基本结构:

  • while语句

  • for语句

  • do...while语句

这里我们先简单了解一下while语句,详细的讲解会放在下一章内容


while语句基本框架:

表达式1;

while(表达式2)

{

  语句;

  表达式3;

}

注:在进入循环之前,一定要对变量(i)进行赋值(初始化)。

示例:

解释:

定义一个整数形式变量i,然后进入while循环结构,当i<=100时,将在while循环结构进行循环,循环内容为i++( i++的意思是将变量i中的数值参加运算后,i中的数值自动加一。“++”符号是编程语言中的自增运算符,作用是在运行后将变量的数值自动加一),所以每一次循环,i都会自增加1,当i=101时,不满足进入循环的条件(i<=100),则跳出循环,对i进行输出,所以结果为101。

注:while(1)是一个死循环。


由于篇幅有限,下一次内容我们将分享函数、数组、运算符、#define定义宏、关键字的补充。
如果您在阅读中发现内容错误或者有好的想法以及建议,欢迎在公众号内给我留言,我将不胜感激!
感谢您能够阅读到这里,我们下次再会!

责编:霖海岛LHaisland

审核:霖海岛LHaisland

图文来源:霖海岛LHaisland


相关文章