PTA练习7-10 查找指定字符 (15 分)-gets()函数不起作用?

综述:

        今天分享的这个题挺好,有一个有意思的问题和一个常见错误,先说有意思的问题:不知道大家在输入一串字符的时候会不会用到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;
}

总结:

        很有意思的题,我觉的出的特别好,一些函数的细节部分我们应该要注意一些,要多看看官方文档,也很有帮助。

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

芝士就是菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值