C语言基础day5

这篇博客详细介绍了C语言中一维数组,特别是字符数组的使用,包括字符串常量、初始化、输入输出函数。此外,还讲解了字符串处理函数如strlen、strcpy、strcat和strcmp的用法,以及随机函数的使用。博客内容涵盖数组遍历、字符串长度计算、字符拷贝等实践练习,适合C语言初学者巩固基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

复习

do-while

do
{
	循环体
}while(表达式);
第一次循环体是无条件执行

三种循环写法是可以互相替代的!

while 不以循环次数作为循环条件

for 以循环次数作为循环条件

do-while 校验循环体执行的结果,不符合预期就循环

定义一维数组

int a[10]; 定义数组时,必须指定长度,长度必须是常量。 //[] {} () <>

元素赋值

a[0];//数组里的第一个元素 0叫做这个元素的角标

a[9];//数组的最后一个元素,数组的最后一个元素的角标一定是数组的长度-1。千万不要越界。

元素的角标还可以是变量

for(i = 0;i < 10;i++)
{
	printf("%d ", a[i]);//数组元素的角标经常被写成变量
}

初始化

定义变量的时候赋值,叫初始化。

完全初始化:

int a[3] = {1,2,3}; 注意,不能使用{}给数组赋值,只有初始化的时候才可以使用{}

​ 初始化的数据的数量和数组的长度是一样的。

部分初始化:

int a[3] = {1}; 初始化的数据的数量小于数组的长度。a[0] = 1 剩下的元素补0。

​ int a[3] = {0}; a[0] = 0 剩下的元素补0。

默认初始化:

int a[] = {1,2,3}; 根据初始化数据的数量来确定数组的长度。

遍历

作业1

求 100 - 200 的素数(质数:只能被1和他自己整除的整数)。

#include <stdio.h>

int main()
{
	int num;
	for(num = 100;num < 201;num++)
	{
		int i;
		//i在循环中的取值范围2~num-1
		//只要有一个i值把num整除,它就不是质数
		//使用否定的逻辑更容易得到结果
		for(i = 2;i < num;i++)
		{
			//只要找到一个i的值把num整除,就不必再判断
			if(num%i == 0)
			{
				break;
			}
		}
		if(i == num)//是质数
		{
			printf("%d 是质数\n", num);	
		}
	}
	return 0;
}

作业2

请输出斐波那契数列的前 20 项。

已知前两项:1 1 。 从第三项开始,每一项都是前两项之和。 1 1 2 3 5 8 13 21 34 。。。6765

#include <stdio.h>

int main()
{
	int fs[20] = {1, 1};
	int i;
	for(i = 2;i < 20;i++)
	{
		fs[i] = fs[i-1]+fs[i-2];
	}

	for(i = 0;i < 20;i++)
	{
		printf("%d ", fs[i]);
	}	
	printf("\n");
	return 0;
}

1、一维数组(字符类型)

字符型的一维数组和非字符型的一维数组特性都是一样的!

字符数组常用来存放字符串!!!

1. 字符串(常量):

以 ‘\0’ 作为结束标志的一组字符。

打印’\0’什么都看不到,它的作用就一个,作为字符串的结尾。

“hello world” 有多少个字符? 字符串常量会自动在所有字符的结尾加字符’\0’ ascii码值是0

“w” 也是字符串常量,因为 ” ” ‘w’ ‘\0’

“” 也是字符串常量 只有’\0’

2. 字符串注意要点:

  1. ‘\0’ 是由c编译系统自动加上的。 ascii 0

  2. 字符串是由双引号引起来的。 “a” --> ‘a’ ‘\0’

  3. “hello” 字符串的长度:字符串里非’\0’的字符数量,所以"hello"长度是5;

    字符串占内存大小,“hello” 占6字节

3. 字符数组的初始化

char s[] = “hello”; //字符串常量可以直接初始化字符数组,默认初始化 字符数组里 ‘h’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’,所以数组s的长度是6。

char a[] = {‘h’,‘e’,‘l’,‘l’,‘o’,’\0’};//数组a和数组s是等价的,因为数组里的内容是一样的。所以数组a里面存放的也是字符串。

char b[] = {‘h’,‘e’,‘l’,‘l’,‘o’}; //数组b和数组a不等价,因为没有字符’\0’,所以数组b中存放的不是字符串,存放的只是一些字符。

char c[10] = {‘h’,‘e’,‘l’,‘l’,‘o’}; //因为部分初始化,剩余的元素会自动补数字0,而数字0就是字符’\0’,所以数组c里面存放的是字符串。

任何基本类型的数组,部分初始化,都是补数字0。

0 整数零

‘\0’ 字符杠零

整数零和字符杠零等价。都可以作为字符串的结尾。

在数组的部分初始化时,补的是整数零(等价于字符杠零)

‘0’ 字符零 和上面两个毫无关系,它是整数48

“1232909” 字符串里出现了0 是 字符零

‘0’

4. 输入输出

1)字符输入输出函数:

输入: getchar(); 只能输入一个字符 如果想使用getchar()获得多个字符,需要循环调用getchar()。
输出: putchar(); 只能输出一个字符,如果想输出多个字符,需要循环调用putchar()

在控制台输入时,在按回车键之前,所有的输入都不会被放进输入的缓存中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fgm3uQGd-1645615093887)(C:\Users\mudonghai\Desktop\C基础\day5\image-20220110112050592.png)]

都不在输入的缓存中

直到按下回车键 enter,才会将以上的字符,连同’\n’一起放到缓存中

缓存中的内容 ‘q’ ‘r’ ‘w’…‘t’ ‘\n’

此时,每执行一次getchar(),会从输入缓存中拿走一个字符。

#include <stdio.h>

int main()
{
    char c;
 	c = getchar();
    putchar(c);
	return 0;
}

2)字符串输出输入函数:

get string

输入: gets(); 得不到最后的’\n’,但是会在输入的最后自动补’\0’,因为gets必须保证拿到的是字符串。

相当于scanf("%s") 得不到输入的空格。比如:hello world 只能拿到hello

put string

输出: puts(); 和printf("%s");等价

#include <stdio.h> 
int main()
{	
    char buf[100];//存放字符串,数组的长度必须保证足够长,把'\0' 的位置也得算上
    printf("gets输入\n");	
    gets(buf);//能获得输入的空格,不会给数组其余的元素补0,只有数组部分初始化时才补0
    printf("puts输出\n");	
    puts(buf);
    printf("scanf 输入\n");	
    scanf("%s", buf);//不能获得输入的空格  数组名就是地址
    printf("printf输出\n");	
    printf("%s\n", buf);	
    return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-53trlnUI-1645615093890)(C:\Users\mudonghai\Desktop\C基础\day5\image-20220110115039749.png)]

练习:

计算字符串长度。 char s[] = “Struggle for a better future”;

统计字符串的长度不算’\0’

#include <stdio.h> 
int main()
{	
	char s[] = "hello world";
	int i = 0;//循环变量
	while(s[i] != '\0')
	{
		i++;//角标移动到下一个元素位置
	}
	//循环结束后,i是'\0'角标
	printf("%d\n", i);
    return 0;
}

练习:

统计字符串中有多少个 ‘e’ char s[] = “Struggle for a better future”;

如果没有思路,可以先把字符串中的每个字符单独打印出来。printf(“%c”);

遍历字符串,遍历字符串一般不用for,因为绝大部分情况下不知道字符串有多长。

#include <stdio.h> 
int main()
{	
	char s[] = "Struggle for a better future";
	int i = 0;
	int count = 0;
	//条件是数组元素不等于字符串的结尾
	//字符串的结尾和数组的结尾是两回事
	//数组的长度一定大于等于字符串的字节数
	while(s[i] != '\0')
	{
		if(s[i] == 'e')
		{
			count++;
		}
		//printf("%c\n", s[i]);
		i++;
	}
	printf("%d\n", count);
    return 0;
}

练习:

请将数组 array 中的所有字符,复制到数组 list 中。

char array[] = “hello world”;

char list[100];

whlie()

{

​ list[i] = array[i];

​ i++;

}

#include <stdio.h> 
int main()
{	
	char array[] = "hello world";
	char list[100];
	int i = 0;
	while(array[i] != '\0')
	{
		list[i] = array[i];
		i++;
	}
	//循环结束之后,i就是list中'\0'应该出现的位置
	list[i] = '\0';
	puts(list);
    return 0;
}

2、字符串处理函数

#include <string.h>

1. 求字符串长度的函数:

string length

int strlen( const char *string );

参数:存放字符串的数组名或者字符串常量

返回值:字符串长度,字符串长度不包含’\0’

#include <stdio.h> 
#include <string.h> 

int main()
{
	char s[100] = "future";//定义字符数组s,使用字符串常量"future"初始化数组
	int n = strlen(s);//计算数组s中存放的字符串长度
	printf("%d\n",n); 
	return 0;
}

2. 字符串拷贝函数:

char *strcpy( char *strDestination, const char *strSource );

参数1:目标数组的数组名,要把字符串拷贝到这个数组里

参数2:要拷贝的字符串,可以是存放字符串的数组名,也可以是字符串常量

返回值:参数1

#include <stdio.h> 
#include <string.h> 

int main()
{
	char name[20];//用来存放字符串      
    char a[20] = "Tony";
	strcpy(name, "Tony");//strcpy(name, a);
	printf("%s\n",name);
	return 0;
}

示例引申:

char s1[20] = "hello\0 world";
printf("%s\n", s1);//输出hello

使用%s操作字符串,遇到’\0’就是字符串结尾,不管后面还有没有字符。

3. 字符串连接函数:

string catch

char* strcat(char* strDestination, const char* strSource);

参数1:存放字符串的数组,保证长度够长。将字符串拼接到这个数组中存放的字符串的后面

参数2:要拼接到后面的字符串,可以是存放字符串的数组名,也可以是字符串常量。

返回值:参数1

#include <stdio.h> 
#include <string.h> 

int main()
{
	char name[20] = "K ";//name数组中存放字符串"K "
	strcat(name, "Tony");//将字符串常量"Tony" 拼接到name “K ”后面
	printf("%s\n",name);//K Tony
	return 0;
}

 

4. 字符串比较函数:

string compare

字符串比较,比较的是什么?

比较的是第一个不相等的字符的ascii码值。

int strcmp( const char *string1, const char *string2 );

参数1:比较的第一个字符串,可以是存放字符串的数组名,也可以是字符串常量

参数2:比较的第二个字符串,可以是存放字符串的数组名,也可以是字符串常量

返回值:1 s1>s2 -1 s1<s2 0 s1==s2

#include <string.h> 
#include <stdio.h> 

int main()
{
	printf("%d\n", strcmp("hello", "hallo"));//结果1   第一个不相等的字符e 和 a   e>a所以s1>s2
	return 0;
}

3、随机函数

#include <stdlib.h>

library

srand(); 初始化随机种子。只需要调用一次。

C语言的随机是假随机,是根据我们给的作为种子的整数,计算出来的一组看似没有规律的整数。

如果每次运行程序都给同一个整数作为种子,那么每次计算出来的一组整数都是一样的。

rand(); 用来随机一个数值。 0 ~ RANDMAX 之间。 每次想得到随机数就调用一次。

time(); 这个函数,用来返回一个时间。是从 1970年1月1日0时0分0秒 开始,到现在的秒数。

示例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	srand(time(0));//使用时间作为随机种子,因为每次运行程序,时间是不一样的。
	int i;
	for(i = 0;i < 10;i++)
	{
		int r = rand()%100;//获得一个随机整数   任何整数%100得到的数都在0~99范围内
		printf("%d ", r);
	}
	printf("\n");
	return 0;
}

-10~10闭区间

随机数范围控制:rand()%取值范围+最小取值

rand()%21-10

练习:

随机出一个数,一个 10 以内的数字。然后请你猜 3 次。

如果猜对了,结束程序,并且输出"Congratulations!"。

如果没有猜对,那么提示一下,你的输入是偏大了,还是偏小。

#include <stdio.h> 
#include <stdlib.h>

int main()
{	
	srand(time(0));
	int num = rand()%10;
	int i;
	for(i = 0;i < 3;i++)
	{
		int input;
		scanf("%d", &input);
		if(input == num)
		{
			printf("恭喜\n");
			break;
		}
		else if(input > num)
		{
			printf("big\n");
		}
		else
		{
			printf("small\n");
		}
	}
	printf("num = %d\n", num);
	return 0;
}

4、阶段总结——填空选择

1.与十六进制数0x200等值得十进制数为( B )

0010 0000 0000

A:256 B:512 C:1024 D:2048

2.switch语句( A )。

A:都可以用if-else if结构实现 B:都不可以用if-else if结构实现

C:有的可以用if-else if结构实现 D:大部分不可以用if-else if结构实现

3.若x,i,j和k都是int型变量,则执行下面表达式后x的值为( C )。

​ 赋值运算符表达式的结果,是左值的结果

​ x=(i=4,j=16,k=32)

A)4 B)16 C)32 D)52

4.C 语言运算对象必须是整型的运算符是______%_____。(东软)

5.求解逗号表达式(a=3*5,a*4),a+5,表达式的值为______20________。(东软汽车电子)

6.执行语句

for(s=0,i=1;i<11;i++) {

​ if(i==6)

​ break;

​ s+=i;

}后,s 值为 15。 (东软汽车电子)

7.若以下变量均是整型,且num=sum=7;则执行表达式 sum=num++,sum++,++num;后sum的值为______8_____。 (东软)

8.关于if语句,下面哪一种说法是错误的 ( D ) (牛客网)

A: 一个if只能有一个else与之配对

B: if语句中可以有多个else if子句

C: if语句中可以包含循环语句

D: if语句中不能包含switch语句

9.下面哪个语句无法通过编译? ( B ) (牛客网) B 编译能过,但是逻辑有问题。

a = 10;//这个表达式的结果就是a被赋值后的值。

A: if (x>y);

B: if ((x=y) && (x!=0)) x+= y;

C: if (x!=y) scanf("%d",&x); else scanf("%d",&y);

D: if (x<y) {x++; y++;}

10.若整型变量a、b、c、d中的值依次为:1、4、3、2。则条件表达式a<b?a:(c<d?c:d)的值 ( A ) 。(牛客网)

A: 1

B: 2

C: 3

D: 4

11.已知int i=1, j=2;,则表达式i++ + j的值为( C )。

A: 1

B: 2

C: 3

D: 4

12.break和continue两个都是( A )(美行科技)

(A)控制循环指令 (B) 数据结构

© 相等的判断 (D) 不包含在C++中

13.有以下程序

main()

{ int a=666,b=888;

printf("%d %d\n",a);

}

程序运行后的输出结果是( B )。

A: 错误信息

B: 666

C: 888

D: 666,888

14.执行完a=5 mod 3 语句后,a的值为?( B ) (牛客网)

A: 0

B: 2

C: 3

D: 5

15.以下不能定义为用户标识符的是( D ) 。(牛客网)

A: Main

B: _0

C: _int

D: sizeof

16.语句for( ;1;)是什么意思? ( A )。 (腾讯)

A: 死循环

B: 编译错误

C: 执行1次

D: 执行2次

5、阶段总结——编程题

1.编写一个程序,将用分钟表示的时间段 转化成 以小时和分钟表示的 时间段。

示例: 输入 120 输出: 2:00

​ 130 输出: 2:10

#include <stdio.h> 

int main()
{
	int min;
	scanf("%d", &min);
	int h = min/60;
	int m = min%60;
	printf("%d:%d\n", h, m);
	return 0;
}

2.编一个程序求从2开始的N个质数的和,

例如F(7)= 2+3+5+7+11+13 +17 58

#include <stdio.h> 

int main()
{
	int n;
	scanf("%d", &n);
	int num = 2;
	int sum = 0;
	while(n)
	{
		int i;
		for(i = 2;i < num;i++)
		{
			if(num%i == 0)
			{
				break;
			}
		}
		if(i == num)
		{
			sum += num;
			n--;
		}
		num++;
	}
	printf("sum = %d\n", sum);
	return 0;
}

3.输入n值,屏幕输出如图所示矩形。

​ A

​ A B A

​ A B C B A

​ A B C D C B A

A B C D E D C B A

上图是n = 5时的图形。

​ (北京麦邦)

#include <stdio.h> 

int main()
{
	int n;
	scanf("%d", &n);
	int i;
	int spaceCount = n-1;
	int charCount = 1;
	for(i = 0;i < n;i++)
	{	
		//打印空格 建议 循环变量能加就不减
		int j;
		for(j = 0;j < spaceCount;j++)
		{
			printf("  ");
		}
		spaceCount--;

		char c = 'A';
		int flag = 1;
		for(j = 0;j < charCount;j++)
		{
			printf("%c ", c);
			if(j == i)
			{
				//flag*=-1;
				flag = -1;
			}
			c+=flag;
		}
		charCount+=2;
		printf("\n");
	}

	return 0;
}

4.输入某年某月某日,判断这一天是这一年的第几天。

#include <stdio.h> 

int main()
{
	int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
	int y, m, d;
	scanf("%d%d%d", &y, &m, &d);
	if(y%4==0&&y%100!=0 || y%400==0)
	{
		month[1]+=1;
	}
	int i;
	int sum = 0;
	for(i = 0;i < m-1;i++)
	{
		sum += month[i];
	}
	sum += d;
	printf("day = %d\n", sum);
	return 0;
}

作业

将两个数组中的字符串连接起来。 printf("%s",a); 输出“hello world”

char a[20] = "hello ";

char b[20] = "world ";

作业(选做,会讲)

统计一个字符串中有多少个单词? 最大的单词长度是多少?(问题2:选做)

char s[] = “Struggle for a better future”;

作业(选做,会讲)

彩票的故事: 35 选 7 1 ~ 35

  1. 1 ~ 35 之间的七个数随机出来(彩票站)

  2. 1 ~ 35 之间的七个数自选 (用户)不允许重复

  3. 比较中奖的个数(对应上几个数字)

环变量能加就不减
int j;
for(j = 0;j < spaceCount;j++)
{
printf(" ");
}
spaceCount–;

	char c = 'A';
	int flag = 1;
	for(j = 0;j < charCount;j++)
	{
		printf("%c ", c);
		if(j == i)
		{
			//flag*=-1;
			flag = -1;
		}
		c+=flag;
	}
	charCount+=2;
	printf("\n");
}

return 0;

}




4.输入某年某月某日,判断这一天是这一年的第几天。

```C
#include <stdio.h> 

int main()
{
	int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
	int y, m, d;
	scanf("%d%d%d", &y, &m, &d);
	if(y%4==0&&y%100!=0 || y%400==0)
	{
		month[1]+=1;
	}
	int i;
	int sum = 0;
	for(i = 0;i < m-1;i++)
	{
		sum += month[i];
	}
	sum += d;
	printf("day = %d\n", sum);
	return 0;
}

作业

将两个数组中的字符串连接起来。 printf("%s",a); 输出“hello world”

char a[20] = "hello ";

char b[20] = "world ";

作业(选做,会讲)

统计一个字符串中有多少个单词? 最大的单词长度是多少?(问题2:选做)

char s[] = “Struggle for a better future”;

作业(选做,会讲)

彩票的故事: 35 选 7 1 ~ 35

  1. 1 ~ 35 之间的七个数随机出来(彩票站)

  2. 1 ~ 35 之间的七个数自选 (用户)不允许重复

  3. 比较中奖的个数(对应上几个数字)

  4. 兑奖

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

encounter♌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值