1.什么是字符串:
字符串是由字符构建而成的串行结构,'\0'是它的结束标志。
2.字符串存在的方式及如何创建:
1.字符串字面值:
被双引号包括起来的若干个字符,有一个隐藏的’\0’,这种字符串以地址的形式存在在代码中,并且该字符串储存在只读区,一旦定义,不能修改。
创建方法:
char a[] = "Hello";
2.字符数组:
char类型的数组,里面存储的是ASCII值,要注意为’\0’留位置,与字符串字面值相比,字符数组可以根据需要进行修改。
创建方法:
char b[] = {'H','e','l','l','o'};
注意,这两种创建方法得到的字符串长度不一样,第一种方法创建的字符串长度为6,第二种方法创建的字符串长度为5,因为第一种方法最后还有一个’\0’,而第二个方法的’\0’的位置被’o’占用了,所以长度只有5,这样会有一个危险,就是如果后面还有一个字符数组c[]创建,而我只想显示b[]数组里的东西,但因为没有’\0’结尾,会把后面c[]里面的字符也打印出来。
如:
#include <stdio.h>
int main(){
char a[] = "Hello";
char b[] = {'H','e','l','l','o'};
char c[] = {'W','o','r','l','d'};
printf("%s",a);
printf("%s",b);
return 0;
}
输出的结果是:
Hello;
HelloWorld;
3.字符串的输入
1.int getchar(void)(字符的输入)
功能:从键盘接收一个字符。
例子:
#include <stdio.h>
#include <getch.h>
int main(){
char c;
c = getchar(); //接收一个字符
printf("%c",c);
return 0;
}
2.scanf("%s",有效的数组名或者指针变量名)
功能:接收用户输入的数据,缺点是不能接收空格字符,如果有有空格,则剩余字符会影响下次的输入。
例子:
#include <stdio.h>
int main(){
char str1[20];
scanf("%s",str1);
printf("%s",str1);
return 0;
}
3.char *gets(char *s);
功能:可以接收到空格,但它会无限的接收字符直到遇到回车符,但可能会造成段错误或栈崩溃
例子:
#include <stdio.h>
int main(){
char str2[20];
gets(str2);
printf("%s",str2);
return 0;
}
4.char *fgets(char *s,int size,stdin);
功能:键盘读取到一个指定长度的字符串
s:存储字符串的首地址
size:字符串的长度(包含’0’),最多接收size - 1个字符,它会为’\0’预留一个位置
注意:如果字符中有’\n’字符,需要把’\n’去掉
例子:
#include <stdio.h>
int main(){
char str3[20];
FILE *frp = fopen("test","r"); //我test存放的是helloworld
fgets(str3,6,frp);
printf("%s",str3);
return 0;
}
输出:hello
4.字符串的操作
1.size_t strlen(const char *s)
功能:求字符串的长度,不包括’\0’
例子:
#include <stdio.h>
#include <string.h>
int main(){
char str4[] = "Hello World";
printf("%d",strlen(str4));
return 0;
}
输出:11
2.char *strcat(char *dest, const char *src);
功能:在字符串dest后面追加字符串src,即把字符串src接在字符串dest后面
例子:
#include <stdio.h>
#include <string.h>
int main(){
char str5[] = "Hello";
char str6[] = "World";
strcat(str5,str6);
printf("%s",str5);
return 0;
}
输出:HelloWorld
3.char *strncat(char *dest, const char *src, size_t n);
功能:将字符串src的前n个字符接到字符串dest后面
例子:
#include <stdio.h>
#include <string.h>
int man(){
char str7[20] = "Hello";
char str8[10] = "World";
strnact(str7,str8,4);
printf("%s",str7);
return 0;
}
输出:HelloWorl
4.char *strcpy(char *dest, const char *src);
功能:将src字符串的内存拷贝到dest中,即dest = src
例子:
#include <stdio.h>
#include <string.h>
int main(){
char str9[20] = "Hello World";
char str10[20];
strcpy(str10,str9);
printf("%s",str10);
return 0;
}
输出:Hello World
5char *strncpy(char *dest, const char *src, size_t n);
功能:将src字符串的前n个字符拷贝到dest中
例子:
#include <stdio.h>
#include <string.h>
int main(){
char str11[] = "HelloWorld";
char str12[20];
strncpy(str12,str11,5);
str12[5] = '\0'; //记得拷贝完之后在后面加个'\0'来结束,不然如果后面还有空位,会造成乱码
printf("%s",str12);
return 0;
}
输出:Hello
6.int strcmp(const char *s1, const char *s2);
功能:按照字典序,比较两个字符串。
s1 > s2 正
s1 = s2 0
s1 < s2 负
从第一个开始比较,一个一个往后比,直到比出大小。
例子:
#include <stdio.h>
#include <string.h>
int main(){
char str13[] = "abc";
char str14[] = "abd";
printf("%d",strcmp(str13,str14));
return 0;
}
输出:-1
7.int strncmp(const char *s1, const char *s2, size_t n);
功能:将s2前n个字符拿来跟s1比较
#include <stdio.h>
#include <string.h>
int main(){
char str15[] = "abc";
char str16[] = "abcd";
printf("%d",strncmp(str15,str16,3));
return 0;
}
输出:0
8.void *memcpy(void *dest, const void *src, size_t n);
功能:内存拷贝,从src地址拷贝n个字节到dest。
#include <stdio.h>
#include <string.h>
int main(){
char str17[] = "HelloWorld";
char str18[20];
char *p = str17;
memcpy(str18,p+5,5); // 从str17的第六个字符开始,拷贝5个字符
str18[5] = '\0'; // 要记得给字符数组结束标志,不然会乱码
printf("%s",str18);
return 0;
}