字符串:字符串是以空字符(\0)结尾的char类型数组,C语言中一种非常重要的数据类型。
字符串常量(字符串字面量):
由一对双引号括起来的多个字符的序列,比如:“3gniubi”
字符串数组:
首先看这个例子:char a[8]={'3','g','n','i','u','b','i‘};这并不是一个字符串,只是一个字符数组;
正确写法:char a[8]={'3','g','n','i','u','b','i','\0'};
字符串输入:
最常用的两种:gets()和scanf("%s", )
区别:在读取字符串时,scanf()和转换说明%s只能读取一个单词。而gets则可以读取一整行的的输入。
#include<stdio.h>
int main()
{ //输入“3g niubi”这个字符串
char a[10];
gets(a);
printf("%s\n",a);
char b[10];
scanf("%s",&b);
printf("%s\n",b);
return 0;
}
输出结果:
字符串的输出:
最常用的两种:puts(),printf("%s", );
区别:puts()会在输出结果后面加一个换行符。
示例:
#include<stdio.h>
int main()
{
char a[]="abc";
printf("%s",a);
printf("%s",a);
puts(a);
puts(a);
return 0;
}
输出结果:
字符串函数:
1.strlen()
用法:计算字符串有效长度,字符串有效长度指的是字符串中’\0’之前的字符个数,不包括’\0’
strlen和sizeof区别?
strlen是一个来计算字符串长度的函数,遇到第一个“\0”终止;
sizeof是一个运算符,用来计算变量或者对象、类型所占字节的多少;
示例:
#include<stdio.h>
#include<string.h>
int main()
{
char a[]="3gniubi";
int b=strlen(a);
int c=sizeof(a);
printf("%d\n",b);
printf("%d\n",c);
return 0;
}
输出结果:
自己定义一个函数mystrlen,来实现strlen函数的功能:
int mystrlen(char*a)
{
int i=0;
while(a[i]!=0)
{
i++;
}
return i;
}
测试函数:
#include<stdio.h>
int mystrlen(char*a)
{
int i=0;
while(a[i]!=0)
{
i++;
}
return i;
}
int main()
{
char *a="3g\0niubi";
int c=mystrlen(a);
printf("%d",c);
return 0;
}
运行结果:
习题:
int main()
{
char b[]= "Hello\0,3g\0";
char* a = b;
char c[255] = {0};
printf("strlen(b) = %d\n", strlen(b));
printf("sizeof(b) = %d\n", sizeof(b));
printf("strlen(a) = %d\n", strlen(a));
printf("sizeof(a) = %d\n", sizeof(a));
printf("strlen(c) = %d\n", strlen(c));
printf("sizeof(c) = %d\n", sizeof(c));
return 0;
}
2.strcat()函数和strncat()函数
strcat函数用于拼接字符串,接收两个字符串作为参数,把第二个字符串附加在第一个字符串末尾,并把拼接后的新字符串作为第一个字符串,第二个字符串不变。
示例:
#include<stdio.h>
#include<string.h>
int main()
{
char a[]="3g";
char *b="niubi";
char *c=strcat(a,b);
printf("%s",c);
return 0;
}
输出结果:
strncat函数用法和strcat函数类似,不同的是strncat可以控制第二个字符串拼接的长短。
示例:
#include<stdio.h>
#include<string.h>
int main()
{
char a[]="3g";
char *b="niubi";
char *c=strncat(a,b,3);
printf("%s",c);
return 0;
}
输出结果:
注意:在调用strcat函数的时候,前一个字符串一定是字符串数组形式,第二个字符串是字符串常量。
错误示例:
#include<stdio.h>
#include<string.h>
int main()
{
char *a="3g";
char *b="niubi";
char *c=strcat(a,b);
printf("%s",c);
return 0;
}
程序在char*c=strcat(a,b);时已经坏掉因此并没有输出结果。
在函数原型中:很明显可以看出第一个字符串是char*类型,第二个是const char*类型。
因此我们在自己定义strcat()函数时,这一点同样至关重要
char* mystrcat(char* str1, const char* str2) {
int i = 0;
int len = strlen(str1);
while (str2[i]) {
str1[len] = str2[i];
i++;
len++;
}
str1[len] = 0;
return str1;
}
测试函数:
#include<stdio.h>
#include<string.h>
char* mystrcat(char* str1, const char* str2) {
int i = 0;
int len = strlen(str1);
while (str2[i]) {
str1[len] = str2[i];
i++;
len++;
}
str1[len] = 0;
return str1;
}
int main()
{
char a[]="3g";
char *b="niubi";
char *c=mystrcat(a,b);
printf("%s",c);
}
输出结果:
3.strcmp()函数
用法:比较两个字符串的大小,自左向右逐个比较ascii码值的大小,直到出现大小不同的两个字符,如果前面字符大,则返回一个大于零的数,如果前面字符小,则返回一个小于零的数,如果直到遇见“\0”一直大小相等,则返回0。
示例:
#include<stdio.h>
#include<string.h>
int main()
{
char a[]="3g";
char b[]="niubi";
char c=strcmp(a,b);
printf("%d",c);
return 0;
}
输出结果:
然后我们来写mystrcmp()函数来实现strcmp的功能:
int mystrcmp(const char* str1, const char* str2) {
int i = 0;
while (str1[i] && str2[i]) {
if (str1[i] == str2[i]) {
i++;
}
else if (str1[i] > str2[i]) {
return 1;
}
else {
return -1;
}
}
return 0;
}
测试函数:
#include<stdio.h>
int mystrcmp(const char* str1, const char* str2)
{
int i = 0;
while (str1[i] && str2[i]) {
if (str1[i] == str2[i]) {
i++;
}
else if (str1[i] > str2[i]) {
return 1;
}
else {
return -1;
}
}
return 0;
}
int main()
{
char a[]="3g";
char b[]="niubi";
char c=mystrcmp(a,b);
printf("%d",c);
return 0;
}
输出结果:
4.strcpy()函数和strncpy()函数
用法:strcpy()函数把第二个字符串拷贝到第一个字符串
示例:
#include<stdio.h>
#include<string.h>
int main()
{
char a[]="3g";
char b[]="niubi";
strcpy(a,b);
printf("%s",a);
return 0;
}
输出结果:
然后我们来写一个mystrcpy()函数来实现strcpy()的功能
char* mystrcpy(char* str1, const char* str2)
{
int i = 0;
while (str2[i]) {
str1[i] = str2[i];
i++;
}
str1[i] = str2[i];
return str1;
}
测试函数:
#include<stdio.h>
char* mystrcpy(char* str1, const char* str2) {
int i = 0;
while (str2[i]) {
str1[i] = str2[i];
i++;
}
str1[i] = str2[i];
return str1;
}
int main()
{
char a[]="3g";
char b[]="niubi";
mystrcpy(a,b);
printf("%s",a);
return 0;
}
测试结果
除此之外,字符串函数还有很多,比如:
strstr
char* strstr(const char* str1,const char* str2)
用法:检索子串在字符串中首次出现的位置,如果检索到子串就返回字符串str1中第一次出现子串str2的地址;如果没有检索到子串,则返回NULL。
strchr
char* strchr(const char* str,char c)
用法:查找字符串中第一次出现c的位置,如果s中存在c就返回首次出现c的位置的指针,如果s中不存在c则返回NULL。