在C语言中,支持常量字符串,不支持变量字符串,如果想要实现类似的变量字符串,C语言提供了 两种实现方式。
字符数组
1 char name[] = "哪吒";
字符指针
1 char *name = "哪吒";
概念
元素类型为char字符型的数组,字符数组往往是用来存储字符串数据的。需要注意的是,我们C语 言中的字符是字节字符
语法
// 一维数组
char 数组名[数组容量];
// 二维数组
char 数组名[行容量][列容量];
字符数组的语法就是我们前面所学的一维数组和二维数组的语法,只不过数据类型是char而已。 注意:
如果我们的char数组初始化的时候,没有完全初始化值的时候, 使用'\0'进行填充。大家要注 意,这里的'\0'只是起到一个占位或者标识的作用,我们是无法通过printf打印输出到控制台的(不支持输出)。
比如:
char c[8] = {'h','e','l','l','o'}; // 等价于下面写法
char c[8] = {'h','e','l','l','o','\0','\0','\0'};
案例 :
需求:输出一个字符序列(I LOVE YOU)
代码
#include <stdio.h>
int main(int argc,char *argv[])
{
//创建一个数组,用来存储I LOVE YOU,ASCII中对应的空格为:'',其对应的ASCII值为32
char arr[]={'I','',L','0','V','E',32,Y','0','U'};
//计算数组的长度
int len sizeof(arr)/sizeof(arr[0]);
//通过for循环遍历数组
for (int i 0;i len;i++)printf("%c",arr[i]);
printf("\n");
return 0;
}
注意:
①如果定义时,不初始化,元素值不确定(针对定义在函数中的数组)
char arr1[2];
//此时这个值是随机的,不固定的
2
char arr2[5]={'a','b','c'};/此时属于不完全初始化,未初始化的元素使用\o进行填充
②如果提供的字符个数大于数组长度,则按照语法错误处理(会报警告,但是能编译通
过):如果字符个数小于数组长度,后面的元素自动补0
char
ar1[2]=('h','e','e'};/编译能通过,但是会报警告,不建议写
2
char arr2[3]{'a'};
/正确,未初始化元素使用\©填充
③如果提供的字符个数与数组长度相同,可以省略数组长度,系统会自动确定元素个数,适
合字符较多时。
char arr1[]{'b','u'};
//正确,根据初始化元素,由系统自动计算元素个数
字符串结束标志
说明
·C语言规定,字符串以字符1作为结束标志。
·编译系统对字符串常量自动加一个\©作为结束标志。比如"helo"实际上的存储
h,'e,I',',o',\0
·程序中往往通过判断©来检测字符串是否结束。
·B的ASCIIT码是0,不是一个可显示可输出的字符,是“空操作符”,它什么都不做,不会增加有
效字符,仅仅用作一个工程判别的标志或者在字符数组中占位。
char a[]={'h','i'}; //hi
char a[]={'h','i','\g'}; //hi
char c[]"hello"; //实际存储形式为hello\0
字符串的基础操作
在用格式化说明符%s进行输入输出时,其输入输出项均为数组名,但在输入时,相邻两个字符串之
间要用空格分隔,系统将自动在字符串后加上\6。在输出时,遇到结束符\©作为输出结束标
志。
对于字符串的操作,我们需要使用到一些系统提供的API函数。
字符串输入
scanf
语法:
scanf("%s",数组名);
注意:数组名对应的数组只能是char类型
fgets
语法:
fgets(数组名,数组容量,stdin);
功能:
从键盘录入一个字符串常量到字符数组,返回字符数组的地址(首地址,默认返回的地址,一
般用12位16进制数表示)
说明:
采用fgets进行字符串输入,可获取所有输入的字符串,包含\n,在实际的字符串处理时,我们
可能需要手动处理\n
注意:
①如果输入的字符串不包括空格或换行,可以使用scanfi或者fgets
如果输入的字符串包括空格或换行,只能使用fgets
gets危险的
语法:
gets(数组名);
功能:
从键盘录入一个字符串常量到字符数组,返回字符数组的地址(首地址,默认返回的地址,一
般用12位16进制数表示)
说明:
采用gets进行字符串输入,可获取所有输入的字符串,包含\n,在实际的字符串处理时,我
们可能需要处理\n
字符串输出
printf
语法:
printf("%s",数组名);
fputs
语法:
fputs(数组名,stdout);
功能:
输出一个字符串
说明:
字符串可以包含转义字符(可以识别转义字符)
puts
语法:
puts(数组名称);
功能:
输出一个字符串
说明:
字符串可以包含转义字符
字符串转数值
strtol
1
long strtol(const char *str,char **endptr,int base);
将字符串转换为长整型数。
参数说明:
str:指向要转换的字符串的指针。
endptr:一个指向字符指针的指针。如果提供了这个参数,并且转换成功,*endptr将被
设置为指向第一个未转换字符的指针。如果endptr是NULL,则不使用它。
base:用于指定转换的基数。它可以是2到36之间的值,或者是特殊值0。如果base
是0,则函数会根据字符串的前缀(如"0x"或"0X"表示十六进制,"0"表示八进制,否则默
认为十进制)来自动确定基数。
strtoul
unsigned long strtoul(const char *str,char **endptr,int base);
将字符串转换为无符号长整型数。
strtod
double strtod(const char *str,char **endptr);
将字符串转换为双精度浮点数。
atoi
int atoi(const char *str);
将字符串转换为整型数(不推荐使用,建议使用strtol)。
atol
long atol(const char *str);
将字符串转换为长整型数(不推荐使用,建议使用stto1)。
atof
double atof(const char *str);
将字符串转换为双精度浮点数(不推荐使用,建议使用 案例: 1 2 3 4 5 6 7 strtod )。
关于单字符的输入:
。scanf("%c",
·getcharO;
关于单字符的输出:
·printf("%c",;
putcharO;