【基础C】比较字符串、生成随机数、实现Swap函数——常见的编译错误及经验积累(二)

目录

① 判断字符串与字符串数组是否相等(易错)

②生成随机数

③用自定义函数交换两个数组中的值


之前的文章还是有很多改进的地方,比如话语啰嗦和解答不及时的问题,大家的时间还是很宝贵的,所以这次的问题解决我会尽量做到详细简介😶‍🌫️

这个经验积累的坑既然挖了,那么肯定是不可能因为没有阅读量而弃坑的😅;

我认为编程思维的训练最好的办法就是每天与代码见面,所以我这次又带来了几点典型的错误与基础知识😎

 共同学习🐵:

QQ:72869268🙉

微信:dusong041008🙈


① 判断字符串与字符串数组是否相等(易错)

错误示范:

在最开始我们判断两个字符串是否相等时,肯定会觉得这很简单,直接将两个字符串通过“==”比较就完了呀,但是结果会是这样⬇️

 正确示范:

这里需要用到  strcmp  函数

•  strcmp

在MSDN中查找strcmp这个函数

传入两个字符指针,返回整型 

通过strcmp的返回值判断得知两字符串是否相等

返回值小于零:字符串1小于字符串2;  返回值大于零:字符串1大于字符串2;

返回值大于零:两字符串相等;

• 正确用法

#include<stdio.h>
#include<string.h>
int main()
{
	char s1 = "dusong";
	char s2[10] = { 0 };

	printf("输入字符串\n");
	scanf("%s", s2);

	if (!strcmp("dusong", s2))   //相等返回值为0,!取反及非零,if判断条件成立
		printf("两字符串相等\n");

	else
		printf("两字符串不相等\n");
		
	return  0;
}

 错误用法:

由上述可知,s1是变量名,传入函数里肯定是不可以的,而s2是数组名,数组名表示数组第一个元素的地址,所以可以直接传入s2

直接传入一个字符串也是可以的。✔️

(补充):

比较两个储存在变量中的字符串可以直接用变量名⬇️

#include<stdio.h>
#include<string.h>
int main()
{
	char s1 = "dusong";
	//char s2[10] = { 0 };
	char s2 = "dusong";

	printf("输入字符串\n");
	//scanf("%s", s2);

	if (s1 == s2)
		printf("两字符串相等\n");

	else
		printf("两字符串不相等\n");
		
	return  0;
}

②生成随机数

先将代码展示出来,以供需求,后面我们来一起解析🎈

#include<stdio.h>
#include<stdlib.h>    //rand函数与srand函数的头文件
#include<time.h>      //time函数的头文件
int main()
{
	srand((unsigned int)time(NULL));

	int rep = 0;
	do {

		int rand_num = rand();
		printf("%d\n", rand_num);

		printf("再次生成请按1,停止请按0\n");
		scanf("%d", &rep);

	} while (rep);

	return 0;
}

 •  rand函数

生成随机数首先就需要一个 rand函数 ,但是只用rand函数结果是这样的⬇️

 你会发现每次调试生成的随机数都是这几个,这时候我们就需要另一个函数了⬇️

•  srand函数 

srand函数会生成随机数的起点,如何使用呢?

①  srand(1) 、 srand(2)....

该函数需要你传入一个无符号整型,每一个都会由不同的起点,那么怎么才能不断改变这个值呢?

•  time函数

我们知道,时间是不断变化的,“逝者如斯夫,不舍昼夜”,首先需要了解时间戳的概念,然后我们来了解time这个函数⬇️

 

 time_t : time_t的实质就是就是长整型⬇️

 time_t * timer : time函数中传入一个指针的,实际使用的时候我们就只需要用空指针NULL

有因为time返回的是长整型,而 srand里面需要传入的是无符号整型,要在srand里面传入一个不断变化的数,就需要将time返回的值强制转换成无符号整型。

② srand((unsigned int)time(NULL)

整体代码:

 我们很容易发现,每次生成的随机数都非常接近,原因是每次进入do-while循环srand都会执行一次,将随机值起点重置,而我们两次生成随机数的时间间隔很短,如果连续按1,生成的随机数大概率是相等的;

解决办法:

每次执行代码我们只需要调用一次srand,根据当前时间戳设置随机值起点就行了,更改后的代码就是最开始给出的代码啦⬆️

③用自定义函数交换两个数组中的值

初步使用函数交换两个值或者改变数组里的值的时候,肯定会经历一次没有结果的代码⬇️

 以上这种方式叫做传值调用,要了解为什么会出现这种情况我们首先要理解两个概念:

实际参数(实参)  形式参数(形参)

实际参数:传递给函数的参数(常量、变量、表达式或者是函数

形式参数:函数名后括号内的变量,函数在调用它时会给它分配内存单元出函数时形参自动销毁

• 当函数调用的时候,实参传递给形参,这是形参是实参的临时拷贝,对形参的修改不影响实参。✔️

解决办法(传址调用):

我们知道,将变量的地址存放在指针里,解引用指针可以改变变量的值,所以我们可以传入这个变量的指针以改变他的值⬇️

#include<stdio.h>

void Swap(char* ps1, char* ps2)
{
	char tmp = *ps1;   //特别注意:这里不能直接用指针(char tmp = ps1)
	*ps1 = *ps2;       //同样:不能直接写成 ps1 = ps2
	*ps2 = tmp;
}

int main()
{
	char s1[] = "dusong";
	char s2[] = "DUSONG";
	int len = strlen(s1);
	printf("交换前:%s %s\n", s1, s2);

	for (int i = 0; i < len; i++)
	{
		Swap(&s1[i], &s2[i]);      //将地址传入函数内;
	}
	printf("交换后:%s %s\n", s1, s2);

	return 0;
}

运行结果:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dusong_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值