今天主要是将函数习题写完。然后学习了bfs,了解其原理和使用模版,但是还没有实践,在写完今天的总结之后,打算写一写填颜色的bfs算法题目,明天应该会总结和大家分享。
那么今天就简单的将函数习题讲一下,提一下要点和知识点,题目如下:
解题思路:1.输入一行字符串。这里我们可以用scanf函数,将字符串存入一个字符数组中。
2.构建一个自定义函数,函数的主要功能:在字符串中找到所有单词,并比较大小,将最长的单词输出。
解题的关键其实就在自定义函数。我们如何实现上面的功能呢?
我的方法是,构建一个循环,将字符数组遍历,从数组的第一个字符开始找,如果是字母的话就将这个字母存储到一个数组中,因为要输出的是最长的单词,需要比较大小,那么每次在存储操作的时候,我们就可以计数一次,计数就代表长度。
那什么时候遇到不是字母的情况了,我们就可以比较一下大小,如果相比上一个得到的数组要更大,那么我们就将新得到的这个存储数组放入fina数组中。如此遍历比较就可以得到最终的结果,存储在了fina数组中。
大家可以注意到,每次要比较字符串大小,是否可以存储到fina中时,都是在遇到不是字母的情况。那如果最后一个字符也是字母呢?
这是需要考虑的情况。那么我们可以在每次确认字符为字母的时候,同时判断一下其是否为最后一个字符,如果是的话,我们就将下面比较大小的部分执行一遍,这样就相当于独立完成了最后一次比大小得fina数组。
程序的整体逻辑就是这样,然后里面还有一些小细节需要注意,我先贴上代码,然后再作出说明:
本次学习使用的几个函数:
strcpy 字符串内容的复制 memset 数组数据清除
#include<stdio.h>
#include<string.h>
void choose(char a[],int n)
{
int max =0;
int m=0;
char b[100] = { 0 };
char fina[100] = { 0 };
for (int i = 0; i < n; i++)
{
if (a[i] >= 'a' && a[i] < 'z' || a[i] >= 'A' && a[i] <= 'Z')
{
b[m++] = a[i];
if ((i + 1) == n)//最后一个数字为字母的情况
{
if (m > max)
{
b[m] = '\0';
strcpy(fina, b);
max = m;
}
}
}
else
{
if (m > max)
{
b[m] = '\0';//在输出字符串时可以停止
strcpy(fina, b);
max = m;
m = 0;//将m和b数组的数据全部清空
memset(b, 0, sizeof(b));
}
}
}
printf("%s", fina);
}
int main()
{
char a[100] = {0};
int n = 0;
scanf("%s", &a);
n = (int)strlen(a);
choose(a,n);
return 0;
}
注意:
在代码中,我们可以看到,每次在存储好fina后,都会将m和数组的数据清除掉。这里因为m我们看做的是字符串的个数,在统计完一个字符串,要统计下一个字符串的时候,需要将其清零才能正确统计下一次的长度。而b数组是存储字符串的,每次我们都会判断这个字符串是否更大,更大的都放进fina了,小的自然就不需要了,而且我们下一次还要用到这个数组存储下一次得到的字符串,所以b数组也要清除数据。
第二点,b【m】='\0' ,这里是因为我们之后输出是直接用printf输出字符串,而在之前的fina数组中并没有‘\0’ ,这样的话就不知道在哪里停止。因为‘\0’是字符串结束的标志,我们在数组最后加上一个‘\0’就可以解决了。
感谢您的阅读,欢迎给出建议和指导。