问题描述】输入一个字符,再输入一个以回车结束的字符串(少于80个字符)在字符串中查找该字符。
【输入形式】一个字符后,再输入一个字符串
【输出形式】一个整数,说明该字符在字符串中的位置,若无该字符,则显示"Not Found"
【样例输入】
m
programming
【样例输出】
7
【样例说明】查找并输出第一个字符的位置,位置从1开始计数。
【评分标准】
我写的第一个代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
char a[80],m;
int i=0;
scanf("%c\n",&m);
gets(a);
int len=strlen(a);
int flag=1;
for(int j=0;j<len;j++){
if(a[j]==m){
printf("*%d*",j+1);
flag=0;
break;
}
}
if(flag==1){
printf("*Not Found*");
}
return 0;
}
如何改进
- 使用
fgets()
替代gets()
函数,避免潜在的瓶颈问题。 - 删除
scanf("%c\n", &m)
中的\n
,因为它可能会吸收输入中的换行符,导致外界的预期行为。 - 添加检查以确保字符存储不会溢出
改进代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main() {
char a[80], m;
printf("Input a character: ");
scanf(" %c", &m); // 去掉scanf中的换行符,增加空格以消耗换行符
printf("Input a string: ");
fgets(a, sizeof(a), stdin); // 更安全的输入函数
int len = strlen(a);
int flag = 1;
if (a[len - 1] == '\n') { // 检查换行符并在需要时删除
a[len - 1] = '\0';
len--;
}
for (int j = 0; j < len; j++) {
if (a[j] == m) {
printf("*%d*", j + 1);
flag = 0;
break;
}
}
if (flag == 1) {
printf("*Not Found*");
}
return 0;
}
输入函数和字符存储:
使用scanf()获取一个字符,并使用%c作为格式化字符串。在%c前面增加了空格以占用可能的空白字符(例如换行符),这有助于避免意外的输入问题。
使用fgets()获取一个字符串,并存储在字符数据库a中,通过fgets()修复了gets()函数可能存在的阵列故障问题。
处理字符串:
使用strlen()获取输入字符串的长度,并在需要时检查补充为换行符\n。如果存在换行符,将其替换为字符串结束符\0,以确保输入字符串是否被正确终止。
循环查找字符:
使用for循环遍历输入字符串中的字符,寻找与用户输入的字符匹配的位置。如果找到匹配的字符,输出其在字符串中的位置,索引从1开始,然后将设为0,表示了flag。
如果循环结束时flag仍然为1,则说明没有找到匹配的字符,此时输出“ Not Found ”。
输出结果:
最后通过printf()输入查找到的字符位置或者“ Not Found ”的信息。
总的来说,大概代码演示了如何通过循环遍历字符数组来查找特定字符在字符串中的位置,并输出相应的结果。改进后面的版本修复了使用不安全函数的问题,并进行了输入的处理,提高了代码的健壮性和可靠性。