目录
之前的文章还是有很多改进的地方,比如话语啰嗦和解答不及时的问题,大家的时间还是很宝贵的,所以这次的问题解决我会尽量做到详细简介😶🌫️
这个经验积累的坑既然挖了,那么肯定是不可能因为没有阅读量而弃坑的😅;
我认为编程思维的训练最好的办法就是每天与代码见面,所以我这次又带来了几点典型的错误与基础知识😎
共同学习🐵:
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;
}
运行结果: