【C语言入门】C语言常见基础必懂概念(二)字符篇

简介: 【C语言入门】C语言常见基础必懂概念(二)字符篇

一、字符 和 ASCII编码

在键盘上可以敲出各种字符,如:aq@# 等,这些符号都被称为 字符

语法:C语⾔中字符是用单引号括起来的,如:‘a’,‘b’,‘@’。

我们知道在 计算机中所有的数据 都是以 二进制 的形式存储的,那这些字符在内存中分别以什么样的⼆

进制存储的呢?

如果我们每个⼈自己给这些字符中的每个字符编⼀个⼆进制序列,这个叫做编码,为了方便⼤家相互通信,不造成混乱,后来美国国家标准学会(ANSI)出台了⼀个 标准 ASCII 编码 ,C语言中的字符就遵循了 ASCII 编码的方式。



二、ASCII码

我们不需要记住所有的ASCII码表中的数字,使⽤时查看就可以,不过我们最好能掌握⼏组特殊的数据:

★☆★

  • 字符 A ~ Z 的 ASCII码值 从 65 ~ 90
  • 字符 a~z 的 ASCII码值 从 97 ~ 122
  • 对应的 大小写字符 (a和A)的ASCII码值的 差值32
  • 数字字符 0 ~ 9 的ASCII码值从 48 ~ 57
  • 换行 \n 的ASCII值是:10
  • 在这些字符中ASCII码值从 0~3132个字符不可打印字符无法打印在屏幕上观察


单个字符的打印可以使⽤ %c 来指定格式 :

#include <stdio.h>
int main()
{
 printf("%c\n", 'Q');
 printf("%c\n", 81);   //这⾥的 81 是 字符Q 的 ASCII码值 ,也是 可以正常打印 的
 return 0;
}

可打印字符 展示 :

#include <stdio.h>
int main()
{
 int i = 0;
 for (i = 32; i <= 127; i++)
 {
     printf("%c ", i);
     if (i % 16 == 15){
       printf("\n");
     }
 return 0;
}



三、字符串和\0

C语⾔中如何表⽰字符串呢?使⽤双引号括起来的⼀串字符就被称为字符串,如:“abcdef”,就是⼀个字符串。

字符串的打印格式可以使⽤ %s来指定,也可以直接打印如下:

#include <stdio.h>
int main()
{
 printf(" %s \n", "hello C");
 printf("hello c");
 return 0;
}

C语⾔字符串中⼀个特殊的知识,就是在字符串的末尾隐藏放着⼀个 \0 字符,这个 \0 字符是字符串的结束标志

对于字符串"abcdef",我们实际上看到了6个字符:a,b,c,d,e,f,但是实际上在末尾还隐藏⼀个 \0的转义字符\0 是字符串的结束标志。所以我们在使用 库函数 printf() 打印字符串 或者 strlen() 计算字符串长度 的时候,遇到 \0 的时候就自动停止了。


C语⾔中也可以把⼀个字符串放在⼀个字符数组中,我们在这里利用下面的代码验证⼀下 \0 的功能。

#include <stdio.h>
int main()
{
 char arr1[] = {'a', 'b', 'c'};//arr1数组中存放3个字符
 char arr2[] = "abc"; //arr2数组中存放字符串
 printf("%s\n", arr1);
 printf("%s\n", arr2);
 return 0;
}

调试观察 arr1 和arr2 的内容:

运行结果

结果分析:

我们可以看到, arr1 字符数组在打印的时候,打印了 a 、 b 、 c 后还打印了⼀些随机值,这就是因为 arr1 在末尾的地⽅没有 \0 字符作为结束标志,在打印的时候没有停⽌

但是 arr2 的打印就是完全正常的,就是因为 arr2 数组是使⽤字符串常量初始化的,数组中有 \0作为技术标志,打印可以正常停止。


★☆★ \0字符串停止 作用

#include <stdio.h>
int main()
{
 char arr1[] = {'a', 'b', 'c', '\0'};
 char arr2[] = "abc";
 printf(" %s \n", arr1);
 printf(" %s \n", arr2);
 printf(" %s \n", "abc\0def");
 return 0;
}

四、转义字符

字符中有⼀组特殊的字符是转义字符。

转义字符顾名思义:转变原来的意思的字符

⽐如:我们有字符 n ,在字符串中打印的时候⾃然能打印出这个字符,如下:

#include <stdio.h>
int main()
{
 printf("abcndef");
 return 0;
}

输出的结果:

如果我们修改⼀下代码,在 n 的前⾯加上 \ ,变成如下代码:

#include <stdio.h>
int main()
{
 printf("abc\ndef");
 return 0;
}

输出的结果:

我们可以看到修改的前后代码输出的结果,截然不同的,那这是为什么呢?

这就是转义字符的问题, \n 是⼀个转义字符表示换行的意思,我们可以简单的理解为 \n 的意思发生了转变n 本来是⼀个普通的字符,被\转义为换行的意思。


C语言中像这样的转义字符还有⼀些,具体如下:

  • \? :在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在新的编译器上没法验证了。
  • \' :⽤于表⽰字符常量’
  • \" :⽤于表⽰⼀个字符串内部的双引号
  • \\ :⽤于表⽰⼀个反斜杠,防止它被解释为⼀个转义序列符
  • \a :警报,这会使得终端发出警报声或出现闪烁,或者两者同时发⽣。
  • \b :退格键,光标回退⼀个字符,但不删除字符。
  • \f :换⻚符,光标移到下⼀⻚。在现代系统上,这已经反映不出来了,⾏为改成类似于 \v 。
  • \n :换⾏符。
  • \r :回⻋符,光标移到同⼀⾏的开头
  • \t :制表符,光标移到下⼀个⽔平制表位,通常是下⼀个8的倍数。
  • \v :垂直分隔符,光标移到下⼀个垂直制表位,通常是下⼀⾏的同⼀列。
    下⾯2种转义字符可以理解为:字符的8进制或者16进制表⽰形式
  • \ddd :d d d表⽰1~3个⼋进制的数字。 如: \130 表⽰字符X
  • \xdd :d d表⽰2个⼗六进制数字。 如: \x30 表⽰字符0

\0null 字符,代表没有内容, \0 就是 \ddd 这类转义字符的⼀种,⽤于字符串的结束标志,其ASCII码值是0.

代码演示:

#include <stdio.h>
int main()
{
 printf("%c\n", '\'');
 printf("%s\n", "\"");
 printf("c:\\test\\code\\test.c\n");
 printf("\a");
 printf("%c\n", '\130'); //130是8进制,转换成10进制是88,以88作为ASCII码值的字符是
 printf("%c\n", '\x30'); //x30中的30是16进制,转换成10进制是48,以48作为ASCII码值的
 return 0;
}

这些ASCII码值是可以自己写代码验证的,⼤家也可以自己验证。

关于转义字符我们首先要了解,然后要能在字符串中识别出来。

转义字符参考:https://zh.cppreference.com/w/c/language/escape

目录
相关文章
|
8天前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
11天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第六章 数组_一维数组_二维数组_字符数组详解
本章介绍了C语言中的数组概念及应用。数组是一种存储同一类型数据的线性结构,通过下标访问元素。一维数组定义需指定长度,如`int a[10]`,并遵循命名规则。数组元素初始化可使用 `{}`,多余初值补0,少则随机。二维数组扩展了维度,定义形式为`int a[3][4]`,按行优先顺序存储。字符数组用于存储字符串,初始化时需添加结束符`\0`。此外,介绍了字符串处理函数,如`strcat()`、`strcpy()`、`strcmp()` 和 `strlen()`,用于拼接、复制、比较和计算字符串长度。
|
1月前
|
C语言
C语言------程设设计入门
这篇文章是C语言程序设计的入门教程,涵盖了C程序的实现过程、VC集成开发环境的使用、基本数据类型的使用、格式控制字符的作用,以及通过示例代码演示了如何使用printf()函数输出不同类型的数据。
C语言------程设设计入门
|
1月前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
|
1月前
|
编译器 C语言
【C语言小知识】ctype.h系列的字符函数
【C语言小知识】ctype.h系列的字符函数
|
1月前
|
NoSQL Java 编译器
C语言从入门到精通该怎样学?
持续学习与实践:编程是一门需要不断学习和实践的技能,要保持对新技术和新知识的敏感性,并持续进行编程实践。
34 1
|
1月前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
|
1月前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
|
1月前
|
存储 编译器 程序员
【C语言篇】C语言常见概念
编译时,注释会被替换成⼀个空格,所以min/* 这⾥是注释*/Value会变成min Value,⽽不是minValue。这是C99标准新增的语法。
|
2月前
|
存储 缓存 C语言
【C语言】字符函数,字符串函数,内存函数
C语言中的字符串函数和内存函数
33 0
【C语言】字符函数,字符串函数,内存函数