7-1 查找指定字符_【C语言】查找指定字符

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-24 05:17   41   0
6faa65fb8422da03e6be2c2d20b9ae18.png

给定一个字符串,如何查找到指定的字符呢?下面看具体的题目要求:

本题要求编写程序,从给定字符串中查找某指定的字符。

输入格式:输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。输出格式:如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。输入样例1:mprogramming输出样例1:index = 7输入样例2:a1234输出样例2:Not Found

看看下面这个程序,有什么问题

564d2fd431f00bfcc67c95a6e4ea77a3.png

这里主要存在的问题:对标准输入的理解不够深刻

6faa65fb8422da03e6be2c2d20b9ae18.png

先把代码复制下来,大家可以尝试运行一把

#include "stdio.h"#include "string.h"int main(){    char c,a[100];    int flag = 100,i;    scanf("%c\n",&c);    gets(a); //scanf("%s",&a);  为啥换成%s就错了呢?错了一个测试点     for( i = 0 ; i strlen(a) ; i++ )        if( c == a[i] )            flag = i;    if( flag == 100 )        printf("Not Found");    else        printf("index = %d",flag);                      return 0;}

怎么样,你运行的结果是什么?

在VC下面运行,出现这样的警告提示

warning C4018: ' : signed/unsigned mismatch

什么意思,类型不一致,希望你能够统一类型,否则出现类型自动转换,如何转换的呢,可以参考之前写的文章。

现在稍微修改代码,改成这样

unsigned flag = 100,i;

反正我们的变量flag和i都是正整数,为什么不直接这样定义呢?

修改之后,肯定没有任何警告和错误了。

运行它,如下输入

11234index = 0

好像真的输出了我们想要的结果,但是你真的确定输入正确吗?

scanf("%c\n",&c);

这个输入格式,要求我们输入一个字符以及'\n'才是正确的输入

1\nNot Found

当我们真的这样正确输入之后,却出现了错误的输出结果,为什么?

我们在输入

1\n

之后,有一个回车,这个回车被记录到了字符串a中

gets(a);

就是它读取了缓存中的这个“回车字符”,而不是读取了'\n'

这个地方是很多同学在格式化输入的时候出现的问题,因为对于这些'\n'字符,是必须按照原样输入的

修改一下

scanf("%c",&c);

这个修改很自然,这样就不需要输入多余的'\n'了,这些字符要我们用户输入本来就是不合理的

运行程序,你会发现什么?

1Not Found

还是输出不正确,为什么,因为在输入1之后,还是给了一个回车,这个回车字符被记录到了字符串a中

换种输入

12135index = 1

发现了什么,可以输出正确的结果,1在2135的第2个字符位置,即a[1]的位置

输入以回车结束,也就是说,如果将所有字符串放在一起输入,就会出现我们想要的结果,如何在回车之后,出现我们题目要求的结果呢?

关键的问题就是,回车符会记录到字符串a中,而a是在缓存中读取的内容,是不是将缓存清除,就可以了?

添加一行代码

fflush(stdin);

现在再来运行一下

12135index = 1

是不是出现我们要的结果了?

到目前为止,基本问题都解决了,再看看注释中的问题

//scanf("%s",&a);  为啥换成%s就错了呢?错了一个测试点

对于这个问题,我们C语言中没有字符串类型变量,只有字符串类型常量,字符串的本质是数组,数组的输入方式定义了,对于数组变量,如果没有在定义的时候直接赋值,就不能整体赋值,所以整体赋值是错误的,所以不能用%s

现在给出完整的代码

#include "stdio.h"#include "string.h"int main(){    char c,a[100];    unsigned flag = 100,i;    scanf("%c",&c);  fflush(stdin);    gets(a); //scanf("%s",&a);  为啥换成%s就错了呢?错了一个测试点     for( i = 0 ; i < strlen(a) ; i++ )        if( c == a[i] )            flag = i;    if( flag == 100 )        printf("Not Found");    else        printf("index = %d",flag);                      return 0;}

基本的问题解决之后,就是代码的优化问题,这个代码中存在很多可以优化的地方,不知道你发现了多少,可以留言讨论。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP