c 语言学习:基本操作,数组,字符串,指针
文章目录
- 基本操作
- 判断闰年平年
- 倒序输出五位数
- 赋值运算
- 用条件表达式求三个数的最大值
- 测试int,float,char类型在本机所占的字节数
- 单个字符的输入getchar()
- 使用*抑制符跳过输入的某个值
- 判断if,else
- 数组
- 选择排序
- 冒泡排序法
- 矩阵转置
- 字符串操作
- strcpy()复制, puts
- strcat()拼接
- 求字符串和字符数组的长度
- puts,pringf;scanf,gets
- strlen()长度
- strcmp()比较
- 指针
- 指针的使用
- 指针与一维数组 ,实现数组的倒序排列
- 指针与字符串
- 指针与二维数组
- 指向数组
c语言学习连接:
- https://blog.csdn.net/zpj779878443/article/details/78229049
- http://www.runoob.com/cprogramming/c-function-getchar.html
基本操作
判断闰年平年
// 判断闰年平年
#include <stdio.h>
int main()
{int year;printf("请输入需要判断的年份:\n");scanf("%d",&year);
// 能被4除尽,前提不是整百年;整百年被400除尽if(!(year%4)&&(year%100)||!(year%400)&&!(year%100)){printf("%d年是闰年\n",year);}else {printf("%d年不是闰年\n",year);}return 0;
}
倒序输出五位数
// 倒序输出五位数
#include <stdio.h>
int main()
{int a,i;printf("请输入需要倒序输出的五位数\n");scanf("%d",&a);//通过&a获得存放这个数据的内存地址的值printf("输出倒序后的五位数:\n");for(i = 0;i<5;i++)//循环5次{printf("%d",a%10);a /= 10;}
}
赋值运算
// 赋值运算
// 括号最大 > ! > 算数运算符 > 关系运算符 > 逻辑与或 > ß赋值运算符
#include <stdio.h>
int main()
{int a,b,c;//普通赋值:a = 2,b= 6,c = 26;a *= b = c = 3; //a = 6,b=3,c=3;printf("a = %d,b = %d,c = %d\n",a,b,c);a += b +=c; //a = 12,b=6,c =3printf("a = %d,b = %d,c = %d\n",a,b,c);a = b == c + 5; //a = 0,b = 6,c = 3printf("a = %d,b = %d,c = %d\n",a,b,c);return 0;
}
用条件表达式求三个数的最大值
//用条件表达式求三个数的最大值
#include <stdio.h>
int main()
{int a,b,c;int max;printf("请输入三个数:\n");scanf("%d%d%d",&a,&b,&c);a > b ? (max = a):(max = b);max > c ? (max = max):(max = c);printf("输出最大值:%d\n",max);return 0;
}
// 逗号表达式的值
#include <stdio.h>
int main()
{int a,b,c;a = b = c = 1;// 逗号表达式遵从从左到右,赋值取最右边的值c = (a = 10,b = 10,2 * a + 5,a + a * b + c);//输出结果:10,10,111;printf("a = %d,b = %d,c = %d\n",a,b,c);return 0;
}
测试int,float,char类型在本机所占的字节数
// sizeof:通常用来测试某个数据类型所占的内存空间大小
// 测试的是int,float,char类型在本机所占的字节数#include <stdio.h>
int main()
{ int a = 1; float b = 1.1; char c = 'cv'; printf("%d,%d,%d\n",sizeof(a),sizeof(b),sizeof(c)); return 0;
}
单个字符的输入getchar()
//单个字符的输入getchar(),输出putchar()
// getchar用法
#include <stdio.h>
int main()
{ char a,b;a = getchar();b = getchar();printf("输出存储的字符\n%c%c\n",a,b); return 0;
}
输出结果
为什么只输出第一个字符和一个回车,第二个字符还没输入就结束了?
答:这是因为getchar()可以获取一个换行符,更改代码如下:
#include <stdio.h>
int main()
{ char a,b;a = getchar();getchar();b = getchar();printf("输出存储的字符\n%c\n%c\n",a,b); return 0;
}
修改后输出:
使用*抑制符跳过输入的某个值
//scanf和printf语句
#include <stdio.h>
int main()
{ int a,b,c; //1.正常的scanf的用法 scanf("%d%d%d",&a,&b,&c); printf("a = %d b = %d c = %d\n",a,b,c); //2.使用*抑制符跳过输入的某个值 scanf("%3d%*2d%2d%3d",&a,&b,&c); printf("a = %d b = %d c = %d\n",a,b,c); //3.最好不要在scanf里面写逗号和空格之类的,不然输入 //输入的时候必须把这些都写上 scanf("%d,%d,%d",&a,&b,&c); printf("a = %d b = %d c = %d\n",a,b,c); return 0;
}
判断if,else
//判断结构中的双分支结构-if else语句
//取钱时判断是否为100的倍数
#include <stdio.h>
int main()
{ int money; printf("请输入你要取款的金额\n");scanf("%d",&money); if (money%100)printf("输入金额错误,请重新输入100的倍数\n"); else printf("出钞%d\n",money);return 0;
}
数组
选择排序
// 选择排序
// 思路,两个for循环,两两比较,如果前者大于后者,交换位置
#include <stdio.h>
int main()
{int i,j,t,a[4]; //输入n个数字,n=4printf("please enter 4 integer\n");for(i=0;i<=3;i++) //输入数值scanf("%d",&a[i]); for(i=0;i<=2;i++) //从第一个数开始,执行n-1次for (j=i+1;j<=3;j++) //从第i+1开始比较if(a[i]>a[j]) {t=a[i];a[i]=a[j];a[j]=t;}printf("\n");for(i=0;i<=3;i++)printf("%5d", a[i]); printf("\n");return 0;
}
冒泡排序法
// 冒泡排序法
//原理:用冒泡排序法的升序排列对任意输入的 10 个数按照从小到大的顺序进行排序。从最左边开始,比较相邻的两位数字,将大的那个放在右边,依次类推,第一轮结束后最大值就是最右边的数字。#include <stdio.h>
int main()
{int i,j,t,a[5]; printf("input 4 integer\n");for(i=1;i<5;i++)scanf("%d",&a[i]); for(i=1;i<4;i++) //变量i代表比较的趟数(趟数=数字个数-1)for(j=1;j<5-i;j++) //变最j代表每趟两两比较的次数if(a[j]>a[j+1]){t=a[j]; //利用中间变童实现两值互换a[j]=a[j+1];a[j+1]=t;}printf("排序后的顺序是:\n");for(i=1;i<=4;i++)printf("%5d",a[i]); //将冒泡排序后的顺序输出printf("\n");return 0;
}
矩阵转置
// 矩阵转置
#include <stdio.h>
int main()
{ int i,j;int a[3][4],b[4][3];printf("please enter an aray element of a:\n");// aray afor(i=0;i<3;i++){for(j=0;j<4;j++)scanf("%d",&a[i][j]); }// transpose of a matrixfor(i=0;i<3;i++){for(j=0;j<4;j++)b[j][i]=a[i][j];}// output aray bprintf("output aray b\n");for(i=0;i<4;i++){for(j=0;j<3;j++)printf("%d",b[i][j]);printf("\n");}return 0;
}
字符串操作
strcpy()复制, puts
// strcpy()复制
// puts()函数会在字符串末尾自动的添加换行符,也就是说它会自动的换行,
// 而printf()函数就没有这项功能
#include <stdio.h>
#include<string.h>
int main()
{char c1[]="hello\0",c2[15];strcpy(c2,c1);puts(c2); // helloprintf("输出字符数组c2的长度:%d\n",sizeof(c2)); // 15return 0;
}
strcat()拼接
// strcat()拼接
#include <stdio.h>
#include<string.h>
int main()
{char c1[]="hello world",c2[10];//除了字符串,这里还可以连接字符数组strcpy(c2,c1);strcat(c1,"pig"); //直接在c1后面拼接 strcpy(c2,"pig"); // 后面的字符数组复制到c2中,c2原来的数组清零,但是c2长度不变puts(c1);puts(c2);return 0;
结果:
求字符串和字符数组的长度
// 求字符串和字符数组的长度
#include <stdio.h>
int main()
{int i=0,n=0;char c[]="abcd\0-";while(c[i++]!='\0'){n++;}printf("输出字符串的长度:%d\n",n);//4, 字符串的结束标志为\0,之后的字符不属于该字符串了 n = sizeof(c)/sizeof(char); //字符数组长度=sizeof(数组名)/sizeof(数组原始类型) printf("output the length of c:%d\n",sizeof(c)); //7,sizeof(数组名)printf("output the length of c:%d\n",sizeof(char)); //1,字符数组一定有个空字符串\0作为字符串的结束标志 printf("输出字符数组的长度:%d\n",n); //7for(i=0;i<7;i++){printf("%c",c[i]); //abcd}return 0;
}
puts,pringf;scanf,gets
// 分别用两种方法演示字符串的输入输出
// puts和pringf区别:puts能自动在末尾输入一个换行符
// scanf和gets区别:scanf不支持空格、制表符输入
#include <stdio.h>
int main()
{char c1[10],c2[10];scanf("%s",c1); printf("%s\n",c1);/*printf("接着输入第二组字符串\n");gets(c2);puts(c2);*/return 0;
}
strlen()长度
// strlen()长度
#include <stdio.h>
#include<string.h>
int main()
{char c[10]="hello";int n;n = strlen(c);//求字符串的长度,不含字符串结束标志'\0' printf("c长度为:%d\n",n);//n=5printf("c长度为:%d\n",sizeof(c));//值为10 printf("c长度为:%d\n",sizeof(char));//值为1。char 型数据占 1 字节return 0;
}
strcmp()比较
// strcmp()比较
#include <stdio.h>
#include <string.h>
/*strcmp(a,b):将a,b两个字符串从左到右对每个字符,按照ASCII码的值进行比较,
知道出现不同的或者’\0’,终止比较,如果内容一样,返回0;大于返回正整数,小于
则返回负整数;*/
int main()
{// strcmp()函数:从左到右根据ASCII码值比较 // 每个字母的大小,直接遇到不同或结束标志时为止char a[5]="abc", b[5]="abc";int flag;
//1. 直接用等号比较的话
//比较的是地址是否一样if(a==b) printf("a==b\n");else if (a!=b) printf("a!=b\n");
//2. 用strcmp()比较flag = strcmp(a,b);if(flag== 0) printf("a与b内容相同\n");else if (flag>0) printf("a>b\n");else if (flag<0) printf("a<b\n");return 0;
}**要点小结:**
1.数组是用来 存储数据类型相同 的变量的 有序集合,可以 通过下标访问 数组中的 元素;
2.一维数组 的定义,初始化与引用;
3.二位数组 用于存储表格数据,定义,初始化与引用;
4.区分字符串与字符数组的区别:字符串是要用字符数组存储,最后要加上一个‘\0’;
5.字符数组的长度至少比字符串多1;
6.使用sizeof(数组名)/sizeof(数组元素的数据类型) = 字符数组长度
7.字符数组直接 == 比较的是 地址
8.使用string.h提供的字符串操作函数:
strcpy(a,b):将b的字符串复制到a中,会覆盖
strcat(a,b):将字符串b的内容拼接到a的后面
strcmp(a,b):将a,b两个字符串从左到右对每个字符,按照ASCII码的值进行比较,
知道出现不同的或者’\0’,终止比较,如果内容一样,返回0;大于返回正整数,小于
则返回负整数;
strlen(a):返回字符串的长度,不包括字符串结束的标记’\0’
指针
- 指针:是一个地址
- 指针变量:用来存放另一变量的地址
- *:表示“指向
- 如果定义变量 i 为指针变量,那么 *i 就表示指针变量i里面存放的地址是所指向的存储单元里面的数据。
- int*i;*表示这个变量是一个指针变量,而int表示这个变量只能存放 int 型变量的地址。
指针的使用
// 指针的使用
#include <stdio.h>int main()
{int a=10,b;int *p,*q;//指针变量的定义
// 取得a变量的地址赋值给pp = &a; b = *p+3;//通过指针变量访问变量 printf("%d\n",p);//p是一个地址:6487616 printf("%d\n",b);//b=13
// 如果p指向的内存中的数据+1,a会等于多少?*p = *p+1;printf("a = %d,b = %d\n",a,b);//a = 11,b = 13
// 我们把p的地址赋给q,然后对q+1,观察a的变化q = p;*q = *q+1; printf("a = %d,b = %d\n",a,b);//a = 12,b = 13 return 0;
}
指针与一维数组 ,实现数组的倒序排列
// 指针与一维数组
#include <stdio.h>int main()
{int a[10]={1,2,3,4,5,6,7,8,9,10};int *p=a,*q=&a[9],*c=&a[3]; int i,num;// 数组名本身就是一个指针(地址),它代表了数组的首地址,数组在内存中连续存放printf("%p %p %p %p\n",a,p,&a[0],q); //%p 打印地址,三者地址相同 printf("*p=%d,*q=%d,*c=%d\n",*p,*q,*c); //*p=1,*q=10,*c=4
// 循环的目的是实现数组的倒序排列 while(p<=q){num = *q;*q = *p;*p = num;
// 将指针p后移一个单位
// 将阵阵q后移一个单位p++;q--; } printf("*p=%d *q=%d\n",*p,*q) ;// *p=5 *q=6 printf("输出交换后的数组:\n");for(i=0;i<10;i++){printf("%d",a[i]);}printf("\n"); //输出结果:10987654321 return 0;
}
指针与字符串
// 指针与字符串
// 双引号表示字符串,单引号表示字符
#include <stdio.h>int main()
{int num = 0;
//定义方式一:char str1[]= "How do you do!"; printf("%s\n",str1);// How do you do! printf("%p\n",str1);// str1指向了字符串的第一个字符的地址 //定义方式二:char *str = "How do you do!"; printf("%s\n",str); // How do you do! printf("%d\n",*str); // 指用字符指针向了字符串的第一个字符H,值为十进制的72 for(;*str;str++)
// 第一个分号前面没有写循环初始状态,表明无条件开始循环。
// *str意思是*str!=0执行,*str==0停止循环
// 执行一次循环体后, 执行步长运算部分: p++{if(*str == 'o') num++;}printf("*str = %d\n",*str);// *str=0 printf("字符串中o出现了%d次\n",num);return 0;
}
指针与二维数组
// 指针与二维数组
#include <stdio.h>
int main()
{int a[2][2] = {{1,2},{3,4}};int (*p)[2],i,j; // 定义一个二维指针 p = &(a[0]);printf("%d",(*p)[0]); // 1return 0;
}
指向数组
// 指向数组
#include <stdio.h>
int main()
{int i,j;int a[2][3];//定义一个行指针,并指向数组的首地址int (*p)[3];// 该语句是定义一个数组指针,指向含4个元素的一维数组// int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,// 也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度p = &(a[0]);printf("请输入二维数组中的数组元素:\n");for(i = 0;i < 2;i++) {for(j = 0;j < 3;j++){scanf("%d",p[i]+j);}}printf("输出二维数组中的数据:\n");for(i = 0;i < 2;i++) {for(j = 0;j < 3;j++){printf("%4d",*(p[i]+j));}printf("\n");}return 0;
}
c 语言学习:基本操作,数组,字符串,指针相关推荐
- 厦大2021届大一小学期C语言作业1 数组+字符串+指针+位操作
文章目录 一.数组与指针 1.手搓冒泡排序(从大到小) 2.矩阵的转置和打印 3.判断矩阵是否对称 4.最大元素与最后元素互换(用指针) 5.首地址偏移法逆序排序 6.指针移动法逆序排序 7.用元素指 ...
- C语言学习笔记---数组和指针的区别
在平时使用数组和指针的时候,感觉他们的使用很类似.那么数字和指针在使用的过程中到底有什么区别呢? 下面通过一个例子来简单分析一下. char str1[] = "abcdef&quo ...
- c语言中void arrout,c语言学习笔记(数组、函数
<c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...
- c语言未初始化的指针下标访问是0,C语言的二数组的指针访问.doc
C语言的二数组的指针访问 二维数组的指针访问 --王炳华 指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点.如果真正弄懂了这个问题,就可以说你学会了使用指针. 二维数组的指针 指针就是地址 ...
- c语言指针转换成数组,浅议C语言中灵魂数组和指针的互操作(转)
浅议C语言中灵魂数组和指针的互操作(转)[@more@]曾听好多朋友说,C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减. 当然了,这是无可非议的,但是 ...
- c语言二维数组 ppt,C语言二维数组与指针.ppt
C语言二维数组与指针.ppt 好好考,全国计算机等级考试 二级C语言,第12讲 二维数组与指针,二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 ...
- Go语言学习笔记-数组、切片、map
Go语言学习笔记-数组.切片.map 数组:同一数据类型元素的集合.是值类型,长度固定无法修改 声明格式:var 数组名字 [元素数量] 数据类型 var arr [3] int //声明定义了一个长 ...
- C语言学习之 数组,指针,字符串. (一)
2019独角兽企业重金招聘Python工程师标准>>> 此文由来: 是看到野鬼发表的关于C语言知识内容后,一激动,手一痒.回了一篇.可惜误操作让回复没能保存. 之后再写就是下面的内容 ...
- C语言学习笔记--数组参数和指针参数
1. 数组参数退化为指针的意义 (1)C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C 语言以高效作是最初的设计目标,所以这种方法是不可取的. ...
- C语言学习笔记--数组指针和指针数组
C 语言中的数组有自己特定的类型,数组的类型由元素类型和数组大小共同决定.(如 int array[5]类型为 int[5]) 1.定义数组类型 C 语言中通过 typedef 为数组类型重命名:ty ...
最新文章
- 如何安装蓝湖插件支持Photoshop CC 2017
- 代码质量第5层-只是实现了功能
- 分割BiSeNet笔记
- dedeCMS 静态页面的倒计时插件(原生VS自定义)
- 算法学习(二)快速排序(上)
- 设置文本输入框光标位置,兼容ie,w3c
- threejs编辑器(3D场景编辑器)
- 未检测到与wia兼容的设备_如何解决应用程序找不到扫描仪:错误WIA_ERROR_OFFLINE!...
- VScode与SumatraPDF反向搜索跳转问题
- java水仙花数编程_水仙花数java编程实现
- CM9和AOKP的区别
- java-sec-code学习之path_traversal
- 大数据特点5V 商业智能实现的三个层次
- 7月27日19:30直播预告:HarmonyOS3及华为全场景新品发布会
- 使用sws_scale转换视频、使用swr_convert转换音频
- jupyter notebook ModuleNotFoundError: No module named ‘tensorflow‘---爬出坑
- k8s教程(Volume篇)-PVC详解
- A session ended very soon after starting. Check that the command in profile解决方法
- Android设备双屏显示
- 汽车早讯丨庞大集团董事长回应高管降薪;一嗨租车达成新私有化协议
热门文章
- linux目录空间内存,Linux 目录结构:内存文件夹
- 中南大学计算机085403,What?这些个专业改考数一英一了!
- java 整数加减_JAVA超大整数的加法如何改成减法
- get vue 和set 用法_深入剖析Vue源码 - 数据代理,关联子父组件
- hive通过外表把数据存到mysql中_hive数据去重
- 从本地的win传文件到本地的linux上,pscp.exe实现本地windows下的文件下载(传输)到linux上...
- 水来了,数据中心如何做好防汛防洪措施?
- 五一假期将至,机房维护工作要做好
- 工商银行:IT新架构及银行IT架构转型思考
- opencv android黑屏,装好了OpenCVManager,开启了Camera权限,在手机上CameraFaceDetectionView无图像...