本篇blog主要讲解C语言中的字符串、指针、结构体。
目录
1.字符串
学习字符串前,我们思考一个字符数据输入的问题:如何先存入一个整形变量a,然后在存储一个字符变量b?(注:回车符也属于字符变量)
#include<stdio.h>
int main(){
int a;
char b;
//首先赋值整形变量
scanf("%d",&a);
//其次,如何防止读取换行符
//1.getchar()读取换行符
getchar();
scanf("%c",&b);
//2.赋值抑制符
scanf("%*c%c",&b);
//3.scanf中使用空格符
scanf(" %c",&b);
printf("%d %c",a,b);
}
接下来是字符中常用的函数
#include<stdio.h>
#include<ctype.h>
int main(){
//ctype.h 头文件包含常用的函数是->toupper() tolower()
char a='c';
char b='C';
//将小写字母变成大写字母 / 将大写字母变小写字母
printf("%c %c",toupper(a),tolower(b));
return 0;
}
在C语言中是没有字符串这种数据类型的,我们通常是使用一个字符数组来存储字符串,而尤其应该注意的是,字符数组的末尾是有一个空字符'\0'。
#include<stdio.h>
#include<string.h>
int main(){
char str[10];
char str1[11];
//scanf("%s"); 不能读取空字符
gets(str);
gets(str1);
//1.strlen() 求字符串长度
printf("%d\n",int(strlen(str)));
//2.strcpy() 复制str1替代str
strcpy(str,str1);
printf("%s\n",str);
// strncpy() 复制str1的前3位替代str的前三位
strncpy(str,str1,3);
printf("%s",str);
//3.strcmp(str,str1) 比较str和str1的大小 前者大返回正数 后者大返回负数 相等返回0
// strncmp(str,str1,n) 比较str和str1前n位的大小
//4.strcat(str,str1) 合并str1到str的末尾 要注意:str必须有充足的空间
// strncat(str,str1,n) 合并str1的前n的字符到str的末尾、
//5.strrev(str) 将str倒置
return 0;
}
下面写一个经典题目,求一个字符串中的单词个数:
#include<stdio.h>
#include<string.h>
int main(){
char str[500];
//因为要读取字符串 肯定存在空格 所以使用str
gets(str);
int sum;
for(int i=0;str[i]!='\0';i++){
if(str[i]!=' ' && str[i+1]==' '){
sum++;
}
}
//判断最后一个位置是否是单词
int length=strlen(str);
if(str[length-1] != ' ') sum++;
printf("%d",sum);
return 0;
}
额外补充一个头文件:#include<stdio.h>的函数
#include<stdio.h>
int main(){
//相当于将从键盘上的输入和输出 改到程序中
char str[100];
char str1[100];
//将结果输出到str字符串中
sprintf(str,"Price is %d",99);
printf("%s",str);
gets(str1);
int a,b,c;
//从str1字符串中输入数值
sscanf(str1,"%*1d%4d%2d%2d%*d",&a,&b,&c);
printf("%d%d%d",a,b,c);
return 0;
}
2.指针
指针这个东西,枯燥乏味,较难理解,但其实弄懂了也还可以。无非就是,*是获取存储对象,&是取地址
#include<stdio.h>
int main(){
//我们首先 确定一个整型变量 和指针变量 注:现在并不进行赋值;
int a=233;
int *p;
printf("%p\n",&a); //输出a的地址;
printf("%p\n",&p); //输出p的地址;
//但此时如果运行 printf("%p",p); 是会报错的 ;
//因为 p存储的是 指向的变量的地址 此时并未令p=&a; 所以p为空;
p=&a;
//此时p指向a 那么p->是a的地址;
printf("%p\n",p);
//*p->&a所对应的值
printf("%d\n",*p);
//&p->p的地址
printf("%p\n",&p);
return 0;
}
指针的作用是什么?
我的浅薄之见是->传递数据的地址,高效且节省内存
下面出个简单的指针的题,指针常用到函数里里面:
#include<stdio.h>
void unpointer(int a,int b){
a=a+1;
b=b+2;
}
void pointer(int *a, int *b){
*a=*a+1;
*b=*b+2;
}
int main(){
int a=3,b=2;
unpointer(a,b);
printf("%d %d\n",a,b); //我们发现虽然在unpointer()中对a,b的值进行改变,但输出仍不变
pointer(&a,&b);
printf("%d %d\n",a,b); //通过指针来映射 可以达到在函数中更改局部变量
return 0;
}
3.结构体
结构体的作用是什么?
想象一下,如果现在一个需求,让你统计一个班里所有人的姓名、身高、体重,存储到一维数组、二维数组都是不现实的,所以我们就引申出了结构体:
#include<stdio.h>
typedef struct student{
char name[30];
int age;
char sex[10];
}Stu;
int main(){
Stu students = {"Zsx",30,"man"};
printf("%s\n",students.name);
printf("%d\n",students.age);
printf("%s",students.sex);
return 0;
}
今天就差不多写完了C语言的基础知识,即在以后算法上会用到的知识。从明天起就更新算法方面的知识和题。博主是个算法小菜菜,今年四月份的蓝桥杯获得一个省二,可能就对了6道题左右,希望可以和大家一起进步。 --2022.6.18