【1】字符数组
1.概念:
存储字符的数组称为字符数组
字符串的结束标志是’\0’
"abc"实际存储’a’‘b’‘c’‘\0’
2.字符数组初始化方式:
char s[10] = {"hello"};
char s[10] = "hello";
char s[10] = {'h','e','l','l','o'};
char string[] = "hello"; //数组的大小根据初始化时实际使用的空间来开辟
//sizeof(string) = 6
char s[]; //数组不支持动态开辟,在执行程序时数组大小未知,因此编译即报错。
3.字符数组的输入输出
1.输入:
char s[32] = {0};
1)scanf("%s",s);
//输入的字符串不能包含空格,因为空格是scanf输入结束的标志。
2)
for(i=0;i<10;i++)
{
scanf("%c",&s[i]);
}
//必须要严格按照循环规定的输入次数输入字符
3)字符串专用输入函数
gets
#include <stdio.h>
char *gets(char *s);
功能:从终端获取一串字符
参数:目标字符数组的首地址
返回值:同参数
//gets在输入时不关心数组越界问题
2.输出
char s[32] = {0};
1)printf("%s\n",s);
2)如果需要遍历字符数组中的每一个元素时,采用循环输出。
for(i=0;i<10;i++)
{
printf("%c",s[i]);
}
//严格按照循环规定的输出次数输出字符
3)字符串专用输出函数
puts
int puts(const char *s);
功能:向终端输出一串字符
参数:const char *s 目标字符串的首地址
返回值:
//输出字符串时截止到'\0'
//puts("") //输出换行
char s[10] = {0};
s[10] = "hello"; //报错!!s[10]指的是下标为10的元素,而且这个元素不属于该数组。
s = "hello"; //错误!!s是数组首地址,地址是常量不能被赋值。
strcpy(s,"hello"); //正确
printf("%s\n",s);
【2】string家族函数
#include <string.h>
1.strcpy
char *strcpy(char *dest, const char *src);
功能:实现字符串复制 //默认包含’\0’
参数:char *dest 目标字符数组的首地址
const char *src 源字符数组的首地址
返回值:目标字符数组的首地址
*char strncpy(char *dest, const char *src, size_t n);
//指定字符个数的复制
size_t n //要复制的字符个数
//一般用于对未初始化的字符数组进行赋值。
//在代码里写的字符串常量就代表只读区的地址
2.strlen
size_t strlen(const char *s);
功能:计算字符数组中字符串的实际长度
参数:要计算的字符数组首地址
返回值:字符个数
面试题:strlen和sizeof的区别?
1.sizeof和strlen本质不同,sizeof是个关键字,而strlen是个函数。
2.sizeof计算的是字符数组占用内存的大小,而strlen计算的是字符数组中实际存储的字符串的长度。
3.strcat
char *strcat(char *dest, const char *src);
功能:用于字符串拼接
参数:char *dest目标字符数组首地址 const char *src源字符数组首地址
返回值:目标字符数组首地址
char *strncat(char *dest, const char *src, size_t n);
//指定字符个数的拼接
4.strcmp
int strcmp(const char *s1, const char *s2);
功能:用于字符串比较(比较两个字符串的ascii)
参数:要比较的两个字符串的首地址
返回值: s1 > s2 1
s1 < s2 -1
s1 = s2 0
int strncmp(const char *s1, const char *s2, size_t n);
//指定字符个数比较
作业:1.仿写strlen的功能
从终端获取一串字符,计算并打印字符串的实际长度。
2.仿写strcmp的功能
从终端获取两个字符串s1和s2,比较之后输出结果。
3. 预习指针,尝试用指针实现这两个作业题。