字符串:实质就是多个字符序列,有多个字符组成
c语言中是没有string这种类型的,通常在C中是用字符数组来存储字符串的。字符串可以看做一个特殊的字符数组,为了和普通的数组分开,故在字符串的尾部加上一个结束标志“\0”,“\0”是一个ASCII码值为0的字符,是一个空的操作符,表示什么也没有,所以采用字符数组存放字符串,赋值时就应该包含结束标志“\0”。
字符串的初始化:
char a[] = “123”; 和 char a [] = {‘1’,’2’,’3’};的区别:
“123”其实是由’1’、’2’、’3’、’\0’组成
“123”的存储分布
字符串的输出”%s”,’\0’是不会输出的
#include<stdio.h>
int main()
{
char name[] = "itcast";
/*
int size = sizeof(name);
printf("%d\n",size);
*/
return 0;
}
//字符串初始化
void test2()
{
//\0的ASCII码的值是0
char name[8] = "it";
char name2[8] = {'i','t','\0'};
char name3[8] = {'i','t',0};
char name4[8] = {'i','t'}; //最好不要这样写,没有\0结尾不是字符串
char name5[] = {''i,'t'}; //不是字符串,只能说是普通字符数组
}
void test()
{
//"jack" == 'j' +'a' +'c' + 'k'
char name[10] = "jack8888\n";
//把数组传进去仅仅是个警告
printf(name);
printf(name);
printf(name);
}
#include<stdio.h>
int main()
{
char name[] = "it";
char name2[] = {'o','k'};
printf("%s\n",name); //输出结果it
printf("%s\n",name2); //输出结果itok,内存分析如下:
return 0;
}
%s表示期望输出一个字符串,因此printf函数会从b的首地址开始按顺序输出字符,一直到\0字符为止,因为\0是字符串的结束标记。所以,如果想要创建一个字符串,记得加上结束符\0
常用字符串处理函数:
strlen:计算字符串长度 声明在#include<string.h>中计算的是字符数,并不是字数,一个汉字算作3个字符,计算的字符不包括\0,从某个地址开始数字符的个数,直到遇到\0为止
/*
strlen函数:计算字符串长度
1.计算的是字符数,并不是字数。一个汉字算作3个字符
2.计算的字符不包括\0
3.从某个地址开始数字符的个数,直到遇到\0为止
*/
// strlen函数声明在string.h文件中
#include <string.h>
#include <stdio.h>
int main()
{
//int size = strlen("哈haha");
//printf("%d\n", size);
/*
char name[] = "itcast";
char name2[] = {'0', '\0', '6'};
int size = strlen(name2);
printf("%d\n", size);
*/
char name[] = "itcast";
//printf("%s\n", name);
printf("%c\n", name[3]);
return 0;
}
字符串的输出:
可以使用stdio.h中两个函数来输出字符串,分别是printf和puts函数
printf函数:用%s表示需要输出一个字符串
char a[3] = {'i', 't', '\0'};
printf("%s",a);
字符串的输入:
stdio.h中有2个函数可以用来接收用户输入的字符串,分别是scanf和gets
scanf函数:
char a[10];
scanf("%s",a);
gets函数:
char a[10];
gets(a);
gets跟scanf一样,会从a的首地址开始存放用户输入的字符,存放完毕后,系统会自动在尾部加上一个结束标记\0。
gets一次只能读取一个字符串,scanf则可以同时读取多个字符串
gets可以读入包含空格、tab的字符串,直到遇到回车为止;scanf不能用来读取空格、tab
字符串数组:
使用场合:
一维字符数组中存放一个字符串,比如一个名字char name[20] = "mj"
如果要存储多个字符串,比如一个班所有学生的名字,则需要二维字符数组,char names[15][20]可以存放15个学生的姓名(假设姓名不超过20字符)
如果要存储两个班的学生姓名,那么可以用三维字符数组char names[2][15][20]
初始化
char names[2][10] = { {'J','a','y','\0'}, {'J','i','m','\0'} };
char names2[2][10] = { {"Jay"}, {"Jim"} };
char names3[2][10] = { "Jay", "Jim" };
#include <stdio.h>
int main()
{
char name[] = "jack";
char name1[] = "rose";
char name2[] = "jim";
char name3[] = "jake";
char names[2][10]= {"jack", "rose"};
//printf("%s\n", names[0]);
//printf("%c\n", names[0][3]);
char names2[2][10] =
{
{'j', 'a', 'c', 'k', '\0'},
{'r', 'o', 's', 't', '\0'}
};
return 0;
}