1. 概述

数据类型是现实世界信息表示基本元素。字符则是基本数据类型之一,与之对应的是数字。

限于字符的数量,一般字符类型都是单字节存储。

Linux的shell环境中,shell作为一种弱类型语言,仅存在字符(串)数据类型,需要数字时则会把字符串转换为字符。

恰是这种单一的弱类型脚本语言设定,赋予shell环境强大的字符和文本处理能力。

本篇则主要介绍C语言种有关字符的知识点。

2. 字符

2.1 字符定义和大小

这里的字符,值得肯定是单个字符,包括普通字符和转义字符。超过一个以上的字符,叫做字符串。

C语言示例代码如下:

#include<stdio.h>
#include<stdint.h>
int main(){
printf("char size is : %d\n",sizeof(char));
printf("char max is:%d,min is:%d\n",INT8_MAX,INT8_MIN);
printf("unsigned char max is:%d\n",UINT8_MAX);
return 0;
}

输出结果为:

char size is : 1
char max is:127,min is:-128
unsigned char max is:255

2.2 字符的输入和输出

C语言示例代码如下:

#include<stdio.h>
#include<stdint.h>
int main(){
//编译器分配
char a = 'A';
printf("%c\n",a);
//标准输入输入
printf("input your char:\n");
a = getchar();
printf("your have input:");
putchar(a);
printf("\n");
return 0;
}

输出结果:

A
input your char:
B
your have input:B

2.3 字符的计算

字符的计算,以字符对应的数字为计算元素

C语言示例代码如下:

#include<stdio.h>
int main(){
//算术运算
char a = 'A';
char b = 'Z';
printf("%c,%d %c,%d\n",a,a,a+1,a+1);
if ( b > a )
printf("%c(%d) > %c(%d)\n",b,b,a,a);
else
printf("%c(%d) < %c(%d)\n",b,b,a,a);
return 0;
}

输出结果为:

A,65 B,66
Z(90) > A(65)

3. 字符数组

字符数组跟整型数组一样定义和使用。

字符数组输出时,通过格式化输出,即可以输出单个字符,也可以输出字符串。

C语言示例代码如下:

3.1 字符数组的定义和大小

#include<stdio.h>
#define NAME "liwanliang"
int main(){
int i = 0;
//第1种方式:用数组原始方式初始化字符数组
char name1[] = {'l','i','w','l'};
printf("%d\n",sizeof(name1));
for ( i = 0; i < sizeof(name1); i++ )
{
printf("[%c]",name1[i]);
}
printf("\n");
//第2种方式:用字符串初始化字符数组
char name2[sizeof(NAME)] = NAME;
printf("%d\n",sizeof(NAME));
for ( i = 0; i < sizeof(NAME); i++ )
{
printf("[%c]",name2[i]);
}
printf("\n");
return 0;
}

输出结果如下:

4
[l][i][w][l]
11
[l] [i] [w] [a] [n] [l] [i] [a] [n] [g] []

注意以下代码的区别:

#include<stdio.h>
#include<string.h>
int main(){
int i = 0;
char a[5] = "hello";
char b[8] = "hello";
printf("sizeof(a):%d,strlen(a):%d\n",sizeof(a),strlen(a));
printf("sizeof(b):%d,strlen(b):%d\n",sizeof(b),strlen(b));
for ( i = 0; i < 5; i++ )
{
printf("[%c]",a[i]);
}
for ( i = 0; i < 8; i++ )
{
printf("[%c]",b[i]);
}
printf("%s\n",a);
printf("%s\n",b);
}

输出结果为:

sizeof(a):5,strlen(a):6
sizeof(b):8,strlen(b):5
[h][e][l][l][o][h][e][l][l][o][][][]hello
hello

3.2 字符数组的输入和输出

字符数组的输入,可以如3.1部分定义种讲述的通过编译器分配,也存在其他输入方式:

  1. 函数传递
  2. 文件输入
  3. 网络输入

C语言示例代码如下:

//以下仅仅是一个简单的输入字符存入字符数组的情况,程序逻辑性脆弱,仅作示例
#include<stdio.h>
#define N 10
int main(){
int i = 0;
char name[N];
do
{
name[i] = getchar();
i++;
}while( '\n' == getchar() && i < 10);
for ( i = 0; i < sizeof(name); i++ )
{
printf("%c",name[i]);
}
printf("\n");
return 0;
}

3.3 字符数组的计算

字符的计算包括算术计算和逻辑计算。

以下是一个对字符数组进行排序的C语言示例代码:

4. 字符串

4.1 字符串的定义和大小

C语言示例代码如下:

#include<stdio.h>
#include<string.h>
int main(){
//第1种方式:以字符数组打印字符串
char name[] = "liwanliang";
int i = 0;
//for ( i = 0; i < strlen(name); i++ )
for ( i = 0; i < sizeof(name); i++ )
{
printf("%c",name[i]);
}
printf("\n");
printf("my name is:%s\n",name);
//第2种方式:以字符指针的方式打印
char *name1 = "liwanliang";
printf("my name is:%s\n",name1);
return 0;
}

输出结果如下:

liwanliang
my name is:liwanliang
my name is:liwanliang

4.2 字符串的输入和输出

4.3 字符串的计算

5 字符指针

一言以蔽之,指针就是数据类型(内存大小)的内存地址,用指针运算(取址,赋值)来操作内存。

内存地址同样以变量的形式存放,故名曰指针变量。

指针是变量说法不准确,指针是存放内存地址的变量。

因为变量有只读变量(常量的一种表现形式),故指针有指针常量。

5.1 指向字符的指针

字符指针,就是指向字符的指针不准确。

字符指针,可以指向字符,字符数组,或者字符串。因为字符指针,是指向字符型内存区域的指针。

本部分探讨指向单一字符的指针。

C语言示例代码如下:

#include<stdio.h>
int main(){
char a = 'a';
//p需要用char型指针初始化
char *p = &a;
printf("input your char:\n");
*p = getchar();
printf("you have input char:");
putchar(*p);
printf("\n");
//printf("%c\n",*p);
return 0;
}

输出结果如下:

input your char:
A
you have input char:A

5.2 指向字符数组的指针

5.3 指向字符串的指针

6. 二维字符数组

6.1 纯数组表示

C语言代码如下:

#include<stdio.h>
int main(){
char name1[3][5]={{'l','i',},{'w','a','n',},{'l','i','a','n','g'}};
int i,j = 0;
for ( i = 0; i < 3; i++ )
{
for ( j = 0; j < 5; j++ )
{
printf("%c",name1[i][j]);
}
printf(" ");
}
printf("\n");
char name2[3][5]={ "li","wan","liang"};
for ( i = 0; i < 3; i++ )
{
printf("%s ",name2[i]);
}
printf("\n");
}

输出结果如下:

li wan liang
li wan liang

6.2 字符指针表示

C语言示例代码如下:

最新文章

  1. Linux crontab定时器的使用
  2. 用exp导数据时遇到oracle 1455的错误
  3. OC-苹果官方文档
  4. Canvas中鼠标获取元素并拖动技术
  5. Request、Request.Form、Request.QueryString 用法的区别
  6. websocket以及自定义协议编程一些总结
  7. nyoj 214
  8. java Color
  9. JAVA学习第三十四课 (经常使用对象API)—List集合及其子类特点
  10. css3选择器总结--强大如jquery
  11. 一文教你迅速解决分布式事务 XA 一致性问题
  12. MongoDB GridFS 存储大文件
  13. FFPLAY的原理(三)
  14. 基本矩张量与strike.dip.rake的对应
  15. PAT乙级考前总结(二)
  16. Redis安装完后redis-cli无法使用(redis-cli: command not found)
  17. 第9天【btrfs文件系统、压缩工具及for语句、程序包管理】
  18. PeopleSoft面试题...
  19. AngularJS控制器和AngularJS过滤器的学习(3)
  20. HNOI2018 两天扫雷训练营

热门文章

  1. LeetCode题解之 Find Mode in Binary Search Tree
  2. Appium学习——安装appium Server
  3. 带你熟悉SQLServer2016中的System-Versioned Temporal Table 版本由系统控制的临时表
  4. ASP.NET Boilerplate 学习
  5. kettle用mysql创建资源库执行sql代码报错
  6. Alpha冲刺! Day4 - 磨刀
  7. python 在windows下的 虚拟环境
  8. [android]android Task 任务 简介
  9. 一次ASM磁盘空间假装耗尽 ORA-15041: DISKGROUP SPACE EXHAUSTED
  10. mysql 创建 mb4 字符集数据库