导
读
给定一个字符串,如何查找到指定的字符呢?下面看具体的题目要求:
本题要求编写程序,从给定字符串中查找某指定的字符。
输入格式:输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。输出格式:如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。输入样例1:mprogramming输出样例1:index = 7输入样例2:a1234输出样例2:Not Found
看看下面这个程序,有什么问题

这里主要存在的问题:对标准输入的理解不够深刻
正
文
先把代码复制下来,大家可以尝试运行一把
#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;}
基本的问题解决之后,就是代码的优化问题,这个代码中存在很多可以优化的地方,不知道你发现了多少,可以留言讨论。