- 字符数组
C 语言是没有字符串类型的。那它是如何存放和表示字符串的呢?两种方式——字符串常量以及字符类型的数组。
字符串常量:“FishC”,“小甲鱼”,“鱼C工作室”
字符数组:
可以先定义指定长度的字符数组,然后再给每个元素单独赋值:
int main
{
char str[10];
str[0] = 'F';
str[1] = 'i';
str[2] = 's';
str[3] = 'h';
str[4] = 'C';
str[5] = '\0';
……
}
还可以直接在定义的时候对字符数组进行初始化,这样会方便很多:
int main
{
// 初始化字符数组的每个元素
char str1[10] = {'F', 'i', 's', 'h', 'C', '\0'};
// 可以不写元素的个数,因为编译器会自动计算
char str3[] = {'F', 'i', 's', 'h', 'C', '\0'};
// 使用字符串常量初始化字符数组
char str4[] = {"FishC"};
// 使用字符串常量初始化,可以省略大括号
char str5[] = "FishC";
}
- 字符串处理函数
在实际开发中,你经常会听到大牛说“避免重新造轮子”。如果能用得上官方提供的现成的函数,尽量不要自己去写,这样除了能够大幅度提供工作效率外,也会使你的程序更加稳定和快速。
获取字符串的长度:strlen 函数
拷贝字符串:strcpy 函数和 strncpy 函数
连接字符串:strcat 函数和 strncat 函数
比较字符串:strcmp 函数和 strncmp 函数
strlen函数
//字符串中反斜杠0的意义,strlen获取长度(字符个数),sizeof获取尺寸(占用字节)
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "fangxu";
str[4] = '\0';
printf("%s\n", str);
printf("lenght=%d\n",sizeof(str));
printf("lenght=%d\n",strlen(str));
system("pause")
return 0;
}
拷贝字符串:strcpy 函数和 strncpy 函数
要保证拷贝内容长度不能超过目标,不能把长的拷贝到短的。会报错
下例如果是strcpy(str2,str1)就会报错
//strcpy函数演示
#include<stdio.h>
#include<string.h>
int main(void)
{
char str1[] = "original string";
char str2[] = "new string";
strcpy(str1, str2);
printf("%s\n", str1);
printf("%s\n", str2);
system("pause")
return 0;
}
//strncpy函数与strcpy的不同
//strncpy可添加参数限制拷贝内容长度。末尾要我们手动添加结束符。
#include<stdio.h>
#include<string.h>
int main(void)
{
char str1[] = "To be or not to be";
char str2[40] ;
strncpy(str2, str1,5);/*这里的5限制拷贝内容的长度*/
str2[5] = '\0';/*strncpy没有把结束符\0拷过来,需要我们手动添加*/
printf("%s\n", str2);
system("pause")
return 0;
}
连接字符串:strcat 函数和 strncat 函数
//strncat函数
#include<stdio.h>
#include<string.h>
int main(void)
{
char str1[100] = "I love";/*目标数组要指定长度,且不能小于最终长度*/
char str2[] = "fishc.com";
strcat(str1, " ");/*拷贝内容可以是变量,也可以双引号内加具体字符数组*/
strcat(str1, str2);
printf("%s\n", str1);
system("pause")
return 0;
}
strncat同样的,也可添加参数限制拷贝内容长度。末尾也要我们手动添加结束符。
比较字符串:strcmp 函数和 strncmp 函数
//strcmp函数
#include<stdio.h>
#include<string.h>
int main(void)
{
char str1[] = "fangxu";
char str2[] = "fangxu";
if (!strcmp(str1, str2))/*对比两个函数asc码,如果完全一致就返回1,取反就为0*/
{
printf("两个字符串完全一致\n");
}
system("pause")
return 0;
}
strncmp函数可以设置参数,只对比前面n个字符
数组之间的赋值:
//数组a部分赋值给数组b
#include<stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
int b[3];
int i=0;
for(i=0;i<5;i++)
{
b[i]=a[i+2];//数组a后三个元素赋值给数组b
}
printf("%d,%d,%d\n",b[0],b[1],b[2]);
system("pause")
return 0;
}
//数组a部分赋值给数组b
#include<stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
int b[5];
memcpy(b,a,sizeof(int)*5);//函数前两个参数表面是数组名,等价于数组第一个元素地址。
printf("%d,%d,%d,%d,%d\n",b[0],b[1],b[2],b[3],b[4]);
system("pause")
return 0;
}
//数组a部分赋值给数组b
#include<stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
int b[3];
memcpy(b,&a[2],sizeof(int)*3);//前两个参数是地址
printf("%d,%d,%d\n",b[0],b[1],b[2]);
system("pause")
return 0;
}