- 1. 字符串是什么?
- 2. 字符串怎么用?
- 2.1 声明
- (1)语法
- 2.2 初始化
- (1)语法
- 2.3 输入输出
- 2.4 访问字符
- (1)语法
- 2.5 遍历
- (1)基本套路
- (2)示例
- 2.6 赋值
- 3. 实践
- 3.1 练习
- 3.1.1 统计
- 3.1.2 查找
- 3.1.3 替换
- 3.1.4 逆序/反序
存放字符(char)的数组称为字符数组。在C语言中,使用NULL字符(’ ’)终止的一维字符数组被称作字符串。
字符串的各个元素依次存放各个字符,字符串的变量名代表该数组的首地址。
字符串初始化方式与普通数组一样。
char 字符串变量名[字符数量];2.2 初始化 (1)语法
字符串可以按照普通数组初始化方式初始化。
char 字符串变量名[字符数量] = {字符1,字符2,....,' '};
char greeting[12] = {'H', 'e', 'l', 'l', 'o',' ','W','o','r','l','d',' '};
注意字符串最后一个字符必须是 。
字符串有一种更加简单的初始化写法
char 字符串变量名[字符数量] = 字符串字面量; char 字符串变量名[] = 字符串字面量; char greeting[12] = "Hello World"; char greeting[] = "Hello World";2.3 输入输出
字符串输入输出与数值是一样的,使用函数scanf()和printf()。只是占位符不同,字符串格式占位符为%s。
例如:
#include2.4 访问字符int main(){ char str[1024]; printf("请输入你的名字:"); scanf("%s",str); printf("你好,%sn",str); }
字符串的访问方式与数组数字是一样的,按照索引/下标方式访问。
字符数组名[索引]
打印首字符
printf("%cn", greeting[0]);
修改首字符
greeting[0] = 'F';
打印修改后的字符串
printf("%sn",greeting);
2.5 遍历
(1)基本套路
for (int i=0; ' ' != str[i]; ++i){ // 依次生成字符数组索引
str[i] // 访问数组的每一个字符
}
(2)示例
实现一个字符串的纵向输出
for (int i=0; ' ' != str[i]; ++i){ // 依次生成字符数组索引
printf("%cn",str[i]);
}
2.6 赋值
字符串赋值可以使用遍历的方式
for(int i=0;' '!=s[i];++i){
t[i] = s[i];
}
更便捷的是使用函数strcpy()
strcpy(t,s);
字符串赋值注意事项:
(1)目标字符串长度要大于等于源字符串长度。
(2)目标字符串结尾是’ ’
有些时候,字符串声明时没有初始化,这时字符串里的值是随机值。需要手动赋值。赋值方式如下所示:
char str[30];
for (int i=0; i<30; ++i){
str[i] = ' ';
}
3. 实践
3.1 练习
3.1.1 统计
(1) 输入字符串s,打印出字符串s的长度(不包含’ ’)。
#includeint main(){ char str[30]; scanf("%s",&str); int i=0,count=0; for(i;str[i]!=' ';i++){ count++; } printf("str长度为:%dn",count); }
(2) 输入字符串s和字符c,打印出字符c在字符串s中出现的次数。
#include3.1.2 查找int main(){ char str[100],c; printf("请输入字符串和字符:n"); scanf("%s %c",&str,&c); int i=0,count=0; for(i;str[i]!=' ';i++){ if(str[i]==c){ count++; } } printf("str中%c出现的次数为:%dn",c,count); }
(1) 输入字符串s和字符c,打印出c在字符串s中的第一次出现的位置(第一个字符位置为0,s不包含c返回-1)。
#includeint FindChar(char *str,char c){ for (int i=0;str[i]!=' ';i++){ if(str[i] == c){ return i; } } return -1; } int main(){ char str[100],c; scanf("%s %c",str,&c); int localnum=FindChar(str,c); if(localnum!=-1){ printf("%c在字符串中第一次出现的位置为:%dn",c,localnum); }else{ printf("%c不在字符串中n",c); } }
(2) 输入字符串s和字符c,打印出c在字符串s中的最后一次出现的位置(第一个字符位置为0,s不包含c返回-1)。
#include3.1.3 替换int FindLastChar(char str[],char c){ int Lastnum=-1; for (int i=0;str[i]!=' ';i++){ if(str[i] == c){ Lastnum=i; } } if(Lastnum!=-1){ return Lastnum; }else{ return -1; } } int main(){ char str[100],c; scanf("%s %c",str,&c); int Lastnum=FindLastChar(str,c); if(Lastnum!=-1){ printf("%c在字符串中最后一次出现的位置为:%dn",c,Lastnum); }else{ printf("%c不在字符串中n",c); } }
(1) 输入字符串s、数字n和字符c ,用字符c替换字符串s中n位置的字符,打印出替换结果。
#include#include int ReplaceChar(char str[],char c,int n){ if(n<=strlen(str)-1){ str[n] = c; printf("%sn",str); }else{ printf("Input Error!n"); } } int main(){ int n; char str[100],c; printf("请依次输入字符串、字符c和其所替换的位置:n"); scanf("%s %c %d",str,&c,&n); ReplaceChar(str,c,n); }
(2) 输入字符串s、字符c1和字符c2 ,用字符c2替换字符串s中c1,打印出替换结果。
#include3.1.4 逆序/反序#include int ReplaceChar(char str[],char c1,char c2){ for(int i=0;str[i]!=' ';i++){ if(str[i]== c1 ){ str[i] = c2; } } printf("%sn",str); } int main(){ char str[100],c1,c2; printf("请依次输入字符串、字符c1和替换c1的字符c2:n"); scanf("%s %c %c",str,&c1,&c2); ReplaceChar(str,c1,c2); }
(1) 输入字符串s,打印出字符串s的反序。LeetCode 344. 反转字符串
#includevoid ChangeString(char s1[]){ int count=0; for(int i=0;' '!=s1[i];++i){ ++count; } for(int i=0;i (2) 输入字符串s,判断字符串是否是回文。
#include#include int ComString(char s1[]){ int count=0; for(int i=0;' '!=s1[i];++i){ ++count; } for(int i=0;i (3) 输入一个年月日时分秒组成的数字,按照XXXX年XX月XX日XX时XX分XX秒打印出来。例如:输入20190311180301,打印出2019年3月11日18时3分1秒。
#includeint main(){ char year[5]; char month[3]; char day[3]; char hour[3]; char minute[3]; char second[3]; scanf("%4s%2s%2s%2s%2s%2s",&year,&month,&day,&hour,&minute,&second); printf("%s年%s月%s日%s时%s分%s秒n",year,month,day,hour,minute,second); }



