一、字符串的几种定义方式及输出
1.第一种方式
#include<stdio.h>
int main()
{
int i;
char str[5] = {'a','b','c','d','e'};
for(i=0;i<sizeof(str)/sizeof(str[0]);i++){
printf("%c", str[i]);
}
return 0;
}
2.第二种方式
#include<stdio.h>
int main()
{
int i;
char str2[5] = "abcde";
for(i=0;i<sizeof(str2)/sizeof(str2[0]);i++){
printf("%c", str2[i]);
}
return 0;
}
3.第三种方式
#include<stdio.h>
int main()
{
int i;
char str3[] = "abcde"; //数组元素个数不写,会根据真实大小默认分配
for(i=0;i<sizeof(str3)/sizeof(str3[0]);i++){
printf("%c", str3[i]);
}
return 0;
}
4.第四种方式(推荐)
#include<stdio.h>
int main()
{
//数组名就是地址(大多数情况下)
char *pstr = "hello world";
printf("%s\n",pstr); //字符串用格式占位符%s表示
return 0;
}
二、字符串的存储方式
字符串在内存中,除了有效字符以外,还会自动在后面补一个‘\0’,作为字符串的结束标志
三、计算字符串中字符的个数(strlen)
#include<stdio.h>
#include<string.h>
int main()
{
char str[] = "abcde";
printf("str的真实字母个数为:%d",strlen(str));
return 0;
}
注:计算字符串长度时,不能用sizeof来计算字符串中有效字符的个数,应该用strlen,strlen在计算字符串大小的时候,遇到’\0’后,就结束计数
四、字符串几种常用的API
1.输出字符串:puts()、printf()
#include<stdio.h>
#include<string.h>
int main()
{
char *str = "abcde";
puts(str);
printf("%s",str);
return 0;
}
2.获取字符串:gets()、scanf()
#include<stdio.h>
#include<string.h>
int main()
{
char str[128] = {'\0'};
printf("请输入字符串:\n");
scanf("%s",pstr);
gets(pstr);
return 0;
}
注:避免书写了野指针
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char *pstr; //野指针,会造成非法内存访问,会出现段错误
pstr = (char *)malloc(128); //解决野指针的方法
printf("请输入字符串:\n");
//scanf("%s",pstr);
gets(pstr);
puts(pstr);
return 0;
}
3.计算字符串长度:strlen()
#include<stdio.h>
#include<string.h>
int main()
{
char str[] = "abcde";
printf("str的真实字母个数为:%d",strlen(str));
return 0;
}
4.字符串初始化;memset()
menset(初始化的对象,初始化成什么,初始化多大的空间);
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char *pstr; //野指针,会造成非法内存访问,会出现段错误
pstr = (char *)malloc(128); //申请了空间
menset(pstr,'\0',128); //初始化,把每一个元素都初始化为'\0'
printf("请输入字符串:\n");
//scanf("%s",pstr);
gets(pstr);
puts(pstr);
return 0;
}
注:一旦用了malloc就要注注意内存泄漏的问题
5.字符串拷贝:strcpy()、strncpy()
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char *str1 = "abcde";
char str2[128] = {'\0'};
strcpy(str2,str1); //将str1的内容完全拷贝到str2
printf("复制字符串完毕,%s\n",str2);
memset(str2,'\0',sizeof(str2)/sizeof(str2[0]));//重置字符串
strncpy(str2,str1,2);//选择性拷贝
printf("复制字符串的2个字符为,%s\n",str2);
return 0;
}
6.字符串拼接:strcat()
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char str1[128] = "abcde";
char *str2 = "12345";
strcat(str1,str2);
puts(str1);
return 0;
}
7.字符串比较:strcmp()
str1 > str2 输出结果为:1
str1 = str2 输出结果为:0
str1 < str2 输出结果为:-1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int ret1,ret2,ret3;
char *str1 = "1234";
char *str2 = "123";
char *str3 = "123";
char *str4 = "123";
char *str5 = "123";
char *str6 = "1234";
ret1 = strcmp(str1,str2);
ret2 = strcmp(str3,str4);
ret3 = strcmp(str5,str6);
printf("ret = %d\n",ret1);
printf("ret = %d\n",ret2);
printf("ret = %d\n",ret3);
return 0;
}
8.查找子字符串:strchr()
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char *str = "12345";
char c = '3';
char *p = NULL;
p = strchr(str,c);
if(p == NULL){
printf("没有找到");
}else{
puts(p);
}
return 0;
}
注:找的是字符
9.查找子串:strstr()
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char *str = "12345";
char *substr= "34";
char *p = NULL;
p = strstr(str,substr);
if(p == NULL){
printf("没有找到");
}else{
printf("找到\n");
puts(p);
}
return 0;
}
注;找的是字符串
10.转为小写:strlwr()
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char str[] = "HELLO WORLD"; //window下要定义成数组的形态
puts(strlwr(str));
return 0;
}
11.转为大写:strupr()
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char str[] = "hello world"; //window下要定义成数组的形态
puts(strupr(str));
return 0;
}
12.字符串分割:strtok()
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char *p;
char str[] = "luo,xian,yi";
p = strtok(str,",");
printf("获取到第1个串:p=%s\n",p);
//获取第2个串的方法很奇葩,跟第1次不一样,目标字符串改成NULL
p = strtok(NULL,",");
printf("获取到第2个串:p=%s\n",p);
//获取第3个串的方法很奇葩,跟第2次一样
p = strtok(NULL,",");
printf("获取到第3个串:p=%s\n",p);
return 0;
}
优化后的代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char *p;
char str[] = "luo,xian,yi";
p = strtok(str,",");
int i = 2;
if(p != NULL){
printf("获取到第1个串:p=%s\n",p);
}
while(1){
p = strtok(NULL,",");
if(p != NULL){
printf("获取到第%d个串:p=%s\n",i,p);
}else{
printf("没有子串了\n",p);
break;
}
i++;
}
return 0;
}