一、字符数组
1.字符串的存储
- 连续性:存放空间使连续的,数组在内存中存储相邻元素之间无断点
- 有序性:取地址时元素下标越大地址越小
- 单一性:数组中说有元素的类型必须相同
2.字符串数组的定义
char 数组名 [元素个数]
注:末尾加 \0,字符串的结束标志
3.字符型数组的初始化
(1)全部初始化
char s[6] = "hello";
(2)局部初始化
char s[6] = "he";
没有给定初值的元素,其初始化值为0
(3)默认初始化:可省列表维度
char s[] = "hello";
注:1)字符型数组s为一个容器,s[100]代表总容器为100,"hello"占六个字节,含义为字符数组里
有一个字符串, s[]="hello",s[6]会产生字符串的越界访问
2)数组不能被整体引用
4.字符串的遍历
#include <stdio.h>
int main(void)
{
char s[100] = "Hello";
/*
int i = 0;
while(s[i] != '\0')
{
putchar(s[i]);
++i;
}
/*
put(s);
printf("\n");
return 0;
}
注:
- 0 :int型 数字0 4字节
- '0':char型 ASCII-48号 1字节
- '\0':下、字符型 ASCII-0号 1字节
- “0”:字符串0 1字节
- " " : \0
4.字符串的输入和输出
(1)字符串的输入 : gets(s);
(2)字符串的输出 : puts(s)、scanf("%s",s)、fgets(s);
注:1)sanf无法接收带' '和'\n'的字符串,gets可以接收带' '的字符串,遇到'\n'会停止
2)fgets不会产生越界,只会截取数组里的有效长度
二、字符串的常见操作
1.获得字符串的长度:strlen
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[100] = "Hello World!";
/* int counter = 0;
int i = 0;
while(s[i])
{
++counter;
++i;
}
printf("%d\n",counter);
*/
printf("%lu\n",strlen(s));
printf("%lu\n",sizeof(s));
return 0;
}
- sizeof为容量,其中sizeof=100;
- strlen有效长度,及从开头到\0中间元素的个数,其中strlen=12;
2.字符串的拷贝:strcpy(dst,str);
注:目的空间一定要能够存放的下源字符,目的空间的大小最少为 strlen-1
3.字符串的拼接:strcat(s1,s2);
注:目的空间一定要能够放下拼接后的字符串,目的空间的大小最少为 strlen s1 +strlen s2+1
4.字符串的比较:strcmp(s1,s2);
注:1)两个字符串从左向右依次比较,第一个不相同值的ASCII值大的字符串就大
2)两字符串相同返回0,如果s1>s2,返回>0的值,如果s1<s2,返回<0的值,此处值为转换
为ASCII的差值
三、例题
实现一个类似itoa函数的功能,将一个整型数据转换为字符串。例如n = 1234, 转换的结果存放
到一个字符数组中char s[100], 输出s后得到"1234".
#include<stdio.h>
#include<string.h>
int main(void)
{
int i = 1234;
char s[100];
int j = 0;
while(i != 0)
{
s[j] = i % 10 + '0';
i = i / 10;
++j;
}
s[j] = '\0';
int len = strlen(s);
for(i = 0;i < len / 2;++i)
{
char tmp;
tmp = s[i];
s[i] = s[len - i - 1];
s[len - i - 1] = tmp;
}
puts(s);
return 0;
}