综述:
今天分享的这个题挺好,有一个有意思的问题和一个常见错误,先说有意思的问题:不知道大家在输入一串字符的时候会不会用到gets()函数或者fgets()函数,还是会循环逐个输入,反正我是比较习惯使用gets()/fgets()函数的,感觉比较方便哈哈哈哈,但是在这个题中,会有一个问题,就是你的gets()/fgets()函数会不起作用,不知道大家做这个题的时候有没有遇到这个问题,遇到这个问题有没有解决。然后再说一下一个易错错误,我感觉刷这个题的人应该有很多会 犯,就是当index=max,字符串中有空格时你的结果不对。
那么如何解决gets()/fgets()函数不起作用呢?又如何解决易犯错误呢?下文将一一展开讲解,并且说一下,gets()函数,fgets()函数以及我为什么用了fgets()函数。
题目:
本题要求编写程序,从给定字符串中查找某指定的字符。
输入格式:
输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。
输出格式:
如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。
输入样例1:
m
programming
输出样例1:
index = 7
输入样例2:
a
1234
输出样例2:
Not Found
有趣问题解决:
应该有小伙伴和我一样用了gets()/fgets()吧,有没有人遇到这俩货不起作用的?我是遇到了,输入要查的字符后程序就结束了,好像这俩货就没生效一样,其实这俩货已经生效了只是咱们观察不到罢了。先上图:
我在MSDN上查询的gets(),看一下我的划线部分,文档大概意思说gets()读到一个‘\n’结束,也就是只读'\n'之前的内容,'\n'意思是换行也就是回车,当我们输入完要查询的字符后,是不是要按一下回车,这个回车就被gets()函数读到了,它就以为结束了,所以在我们调试的时候gets()函数好像不起作用一样。
解决办法:在gets()前面用getchar把回车读了就OK啦,是不是挺简单,具体实现可以看我后面代码。
gets()/fgets()区别:
在这一块我大概说一下,这俩货的区别以及我为什么在我的代码里用了fgets(),先说结论性的东西,gets()用的时候一定慎重,尽量别用,上面我说了这家伙只有读到回车才结束,它不管你输入了多少东西,但是啊,我们存放字符串的数组终归有一个大小啊,但是这家伙不知道这个上限。没读到回车它就瞎读,一直读,不管你数组的死活,读的字符比数组都多了,不就乱往别的地址指向的空间瞎几把写东西了吗,这有多不好。
所以呢,我用了fgets(),这货读东西的时候有数,知道自己最多读多少,不越界,不瞎写,这么听话就不容易出现问题。
看看它第二个参数N多好,知道自己的底线,不乱越界。 然后看一下我们写出来的代码1,这时候就出现了我们前面说的那个问题了:
代码1:
#include <stdio.h>
int main()
{
char c = '\0';
c = getchar();
char d = getchar();
char arr[80] = { '\0' };
fgets(arr,80,stdin);
int i = 0;
while (arr[i] != '\0')
{
i++;
}
int flag = 1;
int j = 0;
for (j = i - 1; j >= 0; j--)
{
if (arr[j] == c)
{
printf("index = %d", j);
flag = 0;
break;
}
}
if (flag)
{
printf("Not Found");
}
return 0;
}
问题解决方法:
咱们一开始初始化的时候把80个元素全部初始化成了'\0',这时候问题就来了,假如我们要查找的那个字符的最大下标正好是79,那不就坏了,因为我们查元素的个数用的while循环条件是不等于'\0',但是我们都找到最后了还不是'\0'。这时候就出现了PTA报的错,那么如何解决呢?只需要把字符数组的大小设置成81个就OK了,第81个元素是'\0'。具体代码看代码2。
代码2:
#include <stdio.h>
int main()
{
char c = '\0';
c = getchar();
char d = getchar();
char arr[81] = { '\0' };
fgets(arr,81,stdin);
int i = 0;
while (arr[i] != '\0')
{
i++;
}
int flag = 1;
int j = 0;
for (j = i - 1; j >= 0; j--)
{
if (arr[j] == c)
{
printf("index = %d", j);
flag = 0;
break;
}
}
if (flag)
{
printf("Not Found");
}
return 0;
}
总结:
很有意思的题,我觉的出的特别好,一些函数的细节部分我们应该要注意一些,要多看看官方文档,也很有帮助。