目录
字符数组(笔试重点)
字符数组初始化
字符串数组输出
字符串的输入
字符串处理函数
puts()输出字符串
gets()输入字符串
strlen()计算字符串长度
strcpy()将后面的字符串拷贝到前面的字符串数组里面
笔试题12
strcmp()比较字符串的大小
strcat()将后面的字符串接到前面的字符串数组中
strchr()查找字符的位置
笔试题13
笔试题14
笔试题15
上一篇复习了二维数组,这一篇我们来复习字符数组。
说明:我们学过单片机的一般都是有C语言基础的了,网上关于C语言的资料有很多,大家如果对C语言不熟悉的话可以先去详细学一下,再以这篇博文作为复习资料学习。
这篇博文的目的是复习C语言,我们会陆续以30多个编程题作为复习要点,这30多个编程题基本涵盖了C语言所有的内容了,只要你掌握了这30多个编程题,那么你的C语言基本就没什么问题了。
注意:由于本专栏是嵌入式全栈开发专栏,为了我们能熟悉以后实际工作中的开发环境,我们写C语言全部在Linux中的vim编辑器中写,这么做事为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令,以达到对口训练的目的!
vim编辑器的一些工作命令在上一篇博文中已经详细介绍过了,如果不了解可以先去看看。
我们正式开始:
字符数组(笔试重点)
字符数组初始化
字符数组的初始化有两种方法,一种是逐个赋值,一种是用字符串赋值。
1.char ch[5] = {'h', 'e', 'l', 'l', 'o'}; //麻烦,一般不用
2.char ch[10] = “helloworld”; //方便实用,但是存在bug,有些平台上这样写打印出来后面会跟着很多乱七八糟的东西,如果这样写的话字符数组定义要大一些。
3.推荐写法:char ch[11] = “helloworld”,把’\0’计算进数组长度中。
注意:凡是数组,尽量初始化!要不然数组的元素就会是随机值。
字符串数组输出
Printf(“%s\n”, a); //a是字符串数组的地址,也就是首字符的地址
字符串的输入
1、获取单个字符串
char ch[32] = {0};
scanf(“%s”, ch); //数组名本身就是地址,不需要再取地址
2、获取多个字符串
ch ch1[32] = {0}; char ch2[32] = {0};
scanf(“%s%s”, ch1, ch2); //两个%s之间不需要空格 但是输入的时候需要空格隔开
3、获取字符串和字符
char ch1[32] = {0}, ch;
scanf(“%s %c”, ch1, &ch); //%s和%c之间需要空格,输入的时候字符串和字符也需要空格
4、获取字符串和数字
char ch1[32] = {0}; int n;
scanf(“%s %d”, ch1, &n); //同上,都需要空格隔开
字符串处理函数
puts()输出字符串
1.函数原型:
int puts(const char *s);
作用:
其作用是将一个字符串(以′\0′结束的字符序列)输出到终端
用法:
char ch[32] = “helloworld”;
puts(ch);
类似的函数:
int putchar(int c);
注:这个很少用,我们一般都是直接用printf输出就行
gets()输入字符串
2.函数原型:
char *gets(char *s);
作用:
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数返回值是字符数组的起始地址。它和scanf的区别是,scanf遇到空格结束,gets遇到换行才结束。(Linux下编译会出现警告,可用getchar代替)
用法:
char ch[32];
gets(ch); //可以输入带有空格的字符串,比如hello world
类似的函数:
int getchar(void);
注:这个也很少用,我们一般都是直接用scanf输入就行
strlen()计算字符串长度
3.函数原型:
size_t strlen(const char *s);
作用:
获取字符串的长度,遇到'\0'结束。
用法:
char str1[32] = “helloworld”; char str2[32] = “welcome\0tonanjing”;
printf(“%lu %lu\n”, strlen(str1), strlen(str2));
注:size_t就是unsigned long类型。
strcpy()将后面的字符串拷贝到前面的字符串数组里面
4.函数原型:
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
作用:
把src指向的字符串拷贝到dest指向的内存中,包括字符串结尾的'\0'。
strncpy可以指定拷贝固定的字节。
用法:
char str1[32] = “helloworld”; char str2[32] = “welcome”;
strcpy(str1, str2); //str1变成了welcome
strncpy(str1, str2, 2); //str1变成了welloworld
size_t就是unsigned long类型。
注:数组的赋值,要么在定义的时候初始化,要么逐个元素赋值,要么拷贝
char str[32] = {0}; str = “helloworld”;//错误
笔试题12
问:以下程序输出的结果是什么?
char s3[32]=”helloworld”;
char s4[32]=”111111111222222222”;
strcpy(s4,s3);
printf(“%s\n”,s4);
答案是:helloworld
因为把s3拷贝到s4的时候把s3的结束标志’\0’也拷贝过去了,’\0’覆盖掉了一个第一个2,实际s4变成了helloworld\022222222,但是printf在输出的时候遇到’\0’就结束了,因此输出的结果我们只能看到helloworld。
如果我们不想要将’\0’拷贝过去,想把2也输出,可以用strncpy( )指定拷贝的长度,strncpy(s4,s3,10)指定拷贝长度为10,即不包含helloworld后面的’\0’。这样printf输出的时候就能把后面的2也输出了,最终我们看到的结果就是helloworld222222222
strcmp()比较字符串的大小
5.函数原型:
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
作用:
比较s1指向的字符串和s2指向的字符串;(按字符的ASCII码比较,abcd小于acde)
strncmp指定比较固定的长度,即指定比较前几个字符。
用法:
char str1[32] = “helloworld”; char str2[32] = “welcome”;
strcmp(str1, str2); //结果小于0
返回值:
(如果前面的比后面的大)返回值大于0、(如果前面的比后面的小)返回值小于0、(如果前面的等于后面的)返回值等于0(如if(strcmp(str1, str2)==0) printf(“%s=%s\n”,s1,s2);)
strcat()将后面的字符串接到前面的字符串数组中
6.函数原型:
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
作用:
把src指向的字符串接在dest指向的字符串后面(要求dest指向的内存空间足够大)
strncat连接指定长度的字符串。
用法:
char str1[32] = “helloworld”; char str2[32] = “welcome”;
strcat(str1, str2); //str1变成了helloworldwelcome
strncat(str1, str2, 2); //str1变成了helloworldwe
strchr()查找字符的位置
7.函数原型:
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
作用:
查找字符c在字符串s中的位置,返回的是字符c的地址;
strrchr其实r就是reverse的意思,反向查找字符c在字符串s中的位置。
用法:
char str1[32] = “helloworld”; char ch = 'o';
strchr(str1, ch); //结果是第一个o的位置
strrchr(str1, ch) - str1; //结果是6
笔试题13
问:以下程序输出的什么?
char str1[32] = “helloworld”;
printf(“%s\n”,strchr(str1, ‘w’);
答案是:world
因为strchr(str1, ‘w’)返回的是‘w’的地址,而printf打印的是%s字符串,因此输出为world。
笔试题14
问:以下程序输出的什么?
char str1[32] = “helloworld”;
printf(“%s\n”,strrchr(str1, ‘o’);
答案是:orld
因为从后往前查找,直到找到第一个o,因此结果输出也会把o字符的右边的字符也printf输出。
注意:使用任何一个字符串处理函数都要包含头文件:#include <string.h>
笔试题15
问:字符数组中在指定位置插入字符;(输入hello 3 x 输出hexllo)
我们可以把后面三个字符向后移动三位,然后将a放在第三个位置,然后将那三个字符赋值给后面三个位置。
参考代码:
#include <stdio.h>
#include <string.h>int main(){int num;int ch;char str[32]={0};int i;printf("输入 字符串 插入位置 插入字符\n");scanf("%s %d %c",str,&num,&ch);int length=strlen(str);//计算字符串长度for(i=0;i<length-num+1;i++){ str[length-i]=str[length-1-i]; //移动后三位字符} str[num-1]=ch;//插入字符printf("%s\n",str);return 0;
}
运行结果:
以上就是这篇内容,如想了解更多,欢迎订阅本专栏!
如有问题可评论区或者私信留言,如果想要进交流群请私信!