scanf读取原理
行缓冲:标准缓存区读入字符 ‘20\n’,会打印输出20,紧接着的scanf,会打印输出\n,标准输入缓冲区有\n,scanf(c=%c,&c),直接读取缓冲区的\n字符输出。
scanf匹配规则:scanf函数在读取整型数、浮点数、字符串会忽略'\n'字符
判断闰年
#include <stdio.h>
int main(){
int year;
scanf("%d",&year);
if (year % 400 == 0 || year % 4 == 0 && year % 100 !=0){
printf("year is 闰年");
}
else{
printf("不是闰年");
}
}
小写字母转大写
#include <stdio.h>
int main()
{
char c;
while(scanf("%c",&c)!=EOF)
{
if(c!=0){
printf("%c",c-32);
}
else
{
printf("\n");
}
}
}
一个scanf读多种类型的数据
#include <stdio.h>
//一个scanf读多种类型的数据
//混合输入每次在%c前面加一个空格
int main()
{
int i;
char c;
float f;
scanf("%d %c%f",&i,&c,&f);
printf("i=%d,c=%c,f=%f\n",i,c,f);
return 0;
}
printf输出格式
#include <stdio.h>
int main()
{
printf("name=%s,age=%d,score=%4.1f","xiaoming",22,99.9);
}
选择与循环
反转
#include <stdio.h>
int main()
{
int a;
scanf("%d",&a);
while(a!=0)
{
printf("%d",a%10);
a=a/10;
}
return 0;
}
选择与循环
if
if (){
}
else if {
}
else{
}
while循环
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int i = 1;
int sum = 0;
while (i <= 100) {
sum = sum + i;
i++;
}
printf("sum is %d",sum);
}
for循环
for (表达式1;表达式2;表达式3) 语句;
(1)先执行表达式1.
(2)求解表达式2,若其值为真(值为非0),则先执行for语句中的内嵌语句,后执行第(3)步,若其值为假(值为0),则结束循环,转到第(5)步
(3)求解表达式3
(4)转回第(2)步继续执行
(5)循环结束
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int i, sum;
//for循环中只能有两个分号
for (i = 1,sum =0; i <= 100; i++)
{
sum += i;
}
printf("sum is %d\n",sum);
}
continue
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int i, sum;
for (i = 1,sum =0; i <= 100; i++)
{
if (i%2==0){
continue;//提前结束本轮循环
}
sum += i;
}
printf("sum is %d\n",sum);
}
break
break语句的作用是结束整个循环过程,不再判断执行循环条件是否成立;跳出循环
判断是否是对称数
输入一个整型数,判断是否是对称数,如果是,输出yes,否则输出no,不用考虑这个整型数过大,int类型存不下,不用考虑负值;
例如 12321是对称数,输出yes,124421是对称数,输出yes,1231不是对称数,输出no
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int a,b,c,d;
scanf("%d", &a);
b = 0;
d = a;
while (a!=0) {
c = a % 10;
b = b * 10 + c;
a = a / 10;
}
if (d == b) {
printf("yes\n");
}
else{
printf("no\n");
}
}
数组
数组的定义
-
具有相同的数据类型
-
使用过程中需要保留原始数据
C语言提供了一种构造数据类型---数组。数据,是指一组具有相同数据类型的数据的有序集合。
一维数组的定义格式:
类型说明符 数组名 [常量表达式]
int a[10];//定义一个整型数组,数组名为a,它有10个元素。
#include <stdio.h>
#define N 5
int main() {
//定义一个数组 变量名,后面加上方括号,方括号
//int a[5] = { 1,3,5,7,9 };
int a[N] = { 1,3,5,7,9 };
printf("%d\n", a[3]);
}
打印数组里的每一个元素
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void print(int a[5]) {
for (int i = 0; i < 5; i++) {
printf("a[%d]=%d\n", i, a[i]);
}
}
int main() {
int a[5] = { 1,3,5,7,9 };
print(a);
}
数组在传递时,元素个数传递不过去。可以在子函数中修改数组元素。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void print(int b[],int len) {
for (int i = 0; i < len; i++) {
printf("a[%d]=%d\n", i, a[i]);
b[4] = 20;
}
}
int main() {
int a[5] = { 1,3,5,7,9 };
print(a,5);
printf("a[4]=%d\n",a[4]); //a[4]发生改变
}
字符数组
char c[10];
字符数组的初始化
对每个字符单独赋值
c[0]='X';c[1]='H'
对整个数组进行初始化
char c = {'I','A','H'};
字符数组一般用来存取字符串。通常采用的初始化方式是char c[10] = "hello"。因为C语言规定字符串的结束标志为本0',而系统会对字符串常量自动加一一个'\0',所以字符数组存储的字符串长度必须比字符数组少1字节。char [10]最长存储9个字符,剩余的一个字符用来存储'\0'。
初始化字符数组时,一 定要让字符数组的大小比看 到的字符串的长度多1
#include <stdio.h>
int main() {
char c[6] = { 'h','e','l','l','o' };
char d[5] = "how";
printf("%s---%s", c, d);
}
hello---how
#include <stdio.h>
int main() {
char c[6] = { 'h','e','l','l','o' };
char d[4] = "how";
printf("%s---%s\n", c, d);
char e[10],f[10];
scanf("%s%s", e, f);
printf("%s---%s", e, f);
}
字符数组的传递
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void print(char d[]) {
int i = 0;
while (d[i]!='\0')
{
printf("%c", d[i]);
i++;
}
printf("\n");
d[0] = 'H';
printf(d);
}
int main() {
char c[10] = "hello";
print(c);
return 0;
}
输出:
hello
Hello
字符数组的数组名里存的就是字符数组的起始地址,类型就是字符指针
gets函数与puts函数
gets函数类似与scanf函数,用于读取标准输入。scanf函数在读取字符串时遇到空格就认为读取结束,所以当输入的字符串存在空格时,需要使用gets函数进行读取。
puts输出,并打印一行换行。
#include <stdio.h>
int main() {
char c[20];
gets(c);
puts(c); //等价于printf("%s\n",c)
return 0;
}
从标准输入读取字符,加载到str字符串中,知道遇到(\n)或达到EOF。输入ni hao 可以看到gets会读取空格,最后有'\0',因为gets遇到(\n),不会存储\n,而是将其翻译成空字符'\0'。
str系列字符串操作函数
主要包括:strlen、strcpy、strcmp、strcat等
strlen:用于统计字符串长度
strcpy:用于将某个字符串复制到字符数组中
strcmp:用于比较两个字符串的大小
strcat:用于将两个字符串拼接到一起
#include <stdio.h>
#include <string.h>
int main() {
char c[20] = "jiangsu";
printf("数组c内的长度为%d\n",strlen(c));
char d[20];
char e[20] = "I love";
//char* strcpy(char* to,const char* from);有const修饰代表这个地方可以放一个字符串常量
strcpy(d, c);
puts(d);
/*
输出:
数组c内的长度为7
jiangsu
*/
printf("两个字符串比较后的结果=%d\n", strcmp("how", "hello"));
//输出:两个字符串比较后的结果=1、比较的是字符串的ascii码值
//strcat,拼接两个字符串,目标数组(前)要可以容纳拼接的字符串
strcat(e, c);
puts(e);
//输出: I lovejiangsu
}
指针
指针的本质
指针的使用场景
二级指针的传递
指针的本质
指针的定义
内存区域中的每字节都对应一个编号,这个编号就是“地址”。如果在程序中定义了一个变量,那么在对程序进行编译时,系统就会给这个变量分配内存单元。按变量地址存取变量值的方式称为“直接访问”,如printf("%d",i);、scanf("%d",&i);另一种存取变量的方式称为“间接访问”,即将变量i的地址存放到另一个变量中。在C语言中,指针变量是一种特殊的变量,它用来存放变量地址。
指针变量的定义格式
基类型 *指针变量名
例如:
int *p;
取地址操作符与取值操作符
取地址操作符为&,也称引用,通过改操作符我们可以获取一个变量的地址值;取值操作符为*,也称解引用,通过改操作符我们可以得到一个地址对应的数据。
#include <stdio.h>
int main() {
//指针变量的初始化一定是某个变量取地址
int i = 5;
int* p=&i;
printf("i=%d\n", i);//直接访问
printf("*p=%d", *p);//间接访问
}
/*
输出:
i=5
*p=5
*/
注意:
- 指针变量前面的 * 表示改变量为指针型变量
- 定义指针变量时必须指定其类型
小题
Description
利用while或者for循环计算n!的值。
提示:n!=1*2*3…*n
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 1,total=1,n;
scanf("%d", &n);
while (i<=n) {
total *= i;
i++;
}
printf("%d", total);
}
Description
某人想将手中的一张面值100元的人民币换成10元、5元、2元和1元面值的票子。要求换正好40张,且每种票子至少一张。问:有几种换法?
int main()
{
int t, f, s, o,e=0;
for (t = 1; t <= 10; t++) {
for (f = 1; f <= 19; f++) {
for (s = 1; s <= 37; s++) {
for (o = 1; o <= 37; o++) {
if(10*t+f*5+2*s+o==100&&t+f+s+o==40){
e++;
}
}
}
}
}
printf("%d", e);
}
//34
Description
输入N个数(N小于等于100),输出数字2的出现次数;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i,n;
int a[100];
scanf("%d", &n);
for (i=0;i<n;i++){
scanf("%d", &a[i]);
}
int count = 0;
for (i = 0; i < n; i++) {
if (a[i] == 2) {
count++;
}
}
printf("2出现的次数为%d", count);
}
Description
读取一个字符串,字符串可能含有空格,将字符串逆转,原来的字符串与逆转后字符串相同,输出0,原字符串小于逆转后字符串输出-1,大于逆转后字符串输出1。例如输入 hello,逆转后的字符串为 olleh,因为hello 小于 olleh,所以输出-1注意最后的判断一定要这么写,因为strcmp标准C中并不是返回-1和1,而是负值和正值
#include <stdio.h>
#include <string.h>
int main()
{
char c[100], d[100];
gets(c);
int i, j;
for (i = strlen(c) - 1, j = 0; i >= 0; i--, j++) {
d[j] = c[i];
}
d[j] = '\0';
int result = strcmp(c, d);
if (result < 0) {
printf("%d\n", -1);
}
else if (result > 0) {
printf("%d\n", 1);
}
else {
printf("%d\n", 0);
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i, j;
char k;
scanf("%d%c%d", &i, &k, &j);
printf("i=%d,k=%c,j=%d\n", i, k, j);
}
//输入 1 2 3
* scanf匹配原理
i=1 k= j=2
指针的使用场景
传递与偏移
指针的传递
#include <stdio.h>
void change(int *j)//j为形参,j=&i
{
*j = 10;
}
int main()
{
int i = 5;
printf("before change i=%d\n", i);
change(&i);//函数调用时,把&i成为实参
printf("after change i=%d\n", i);
return 0;
}
指针的偏移
数组是特殊的,不能和整型变量,浮点型变量类比
数组名 a 类型是数组 a 里面存了一个值,是地址值,是数组的起始地址。
#include <stdio.h>
int main() {
int a[5] = { 1,2,3,4,5 };
int* p;
p = a;
printf("*p=%d\n", *p);
for (int i = 0; i < 5; i++) {
printf("%d\n", *(p + i));
}
}
输出:
*p=1
1
2
3
4
5
#include <stdio.h>
int main() {
int n = 0, c;
c = getchar();//getchar() 从标准输入 stdin 获取一个字符(一个无符号字符)
while (c!='\n') {
if (c>='0' && c<='9')
n++;
c = getchar();//为了让你接收下一个字符
}
printf("%d\n", n);
}
标签:main,int,备份,C语言,char,printf,字符串,include
From: https://www.cnblogs.com/hekang520/p/18387104