#include <stdio.h> #include <stdlib.h> int main() { char a[100000],b[100000],c[100000]; int i=0,sum=0,q=0,j; gets(a); for(i=0;a[i]!='\0';i++){ b[i]=a[i]; sum++; } for(i=0;i<sum;i++){ for(j=0;j<sum;j++){ if(a[i]==b[j]){ q++; } } c[i]=q; q=0; } for(i=0;i<sum;i++){ if(c[i]==1){ printf("%c",a[i]); break; }else{ printf("no");} } return 0; }怎么修改优化?
时间: 2023-06-21 13:11:39 浏览: 304
# include <stdio.h>
在优化代码之前,先解释一下原来代码的问题:
1. 没有对数组进行初始化,导致变量c中可能出现垃圾值,影响程序的正确性。
2. 在第三个循环中,每次遍历都会输出“no”,导致输出结果不正确。
3. 使用gets函数存在安全问题,应该使用更安全的fgets函数。
下面是修改后的代码,已经进行了一些优化:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100000
int main() {
char a[MAX_LEN], b[MAX_LEN];
int cnt[256] = {0}; // 初始化为0
fgets(a, MAX_LEN, stdin); // 使用fgets函数
int len = strlen(a);
for (int i = 0; i < len; i++) {
b[i] = a[i];
cnt[a[i]]++; // 统计每个字符出现的次数
}
for (int i = 0; i < len; i++) {
if (cnt[a[i]] == 1) { // 找到第一个出现次数为1的字符
printf("%c\n", a[i]);
return 0;
}
}
printf("no\n"); // 如果没有找到,输出no
return 0;
}
```
优化后的代码使用了数组cnt来记录每个字符出现的次数,避免了使用嵌套循环的方法。同时,使用fgets函数可以更安全地读入字符串,并且在最后输出结果时只输出了找到的第一个符合条件的字符,避免了输出多余的no。
阅读全文