C语言程序修改需求:判断字符串唯一字符出现次数的整体奇偶类型
示例输入输出
- 示例输入:
aaxdxddd
输出: even(偶数) - 示例输入:
aada
输出: odd(奇数) - 示例输入:
aadssssdddd
输出: both(两者皆有)
现有代码
#include <stdio.h> #include <string.h> int main(){ char s[1000]; int i,j,k,count=0,n; printf("Enter the string: "); gets(s); int len = strlen(s); for(i=0;i<len;i++){ count=1; if(s[i]){ for(j=i+1;j<len;j++){ if(s[i]==s[j]){ count++; s[j]='\0'; } } printf(" '%c' = %d \n",s[i],count); if (count%2==0){ printf("even\n"); //break; } else if (count%2==1){ printf("odd\n"); //break; } } } return 0; }
问题描述
当前代码会逐个判断字符串中每个唯一字符的出现次数是奇数还是偶数,但我需要实现的功能是:判断所有唯一字符的出现次数是否全为偶数、全为奇数,或是两者皆有,现寻求代码调整方案。
调整后的代码
#include <stdio.h> #include <string.h> int main(){ char s[1000]; int i, count; int has_even = 0, has_odd = 0; printf("Enter the string: "); // 替换不安全的gets,用fgets读取输入 fgets(s, sizeof(s), stdin); // 去除输入末尾的换行符 s[strcspn(s, "\n")] = '\0'; int len = strlen(s); for(i=0; i<len; i++){ count = 1; if(s[i]){ for(int j=i+1; j<len; j++){ if(s[i] == s[j]){ count++; s[j] = '\0'; } } // 更新奇偶标记 if(count % 2 == 0){ has_even = 1; } else { has_odd = 1; } } } // 根据标记输出最终结果 if(has_even && has_odd){ printf("both(两者皆有)\n"); } else if(has_even){ printf("even(偶数)\n"); } else if(has_odd){ printf("odd(奇数)\n"); } return 0; }
关键修改说明
- 新增
has_even和has_odd两个标记变量,用于记录字符串中是否存在出现次数为偶数或奇数的字符。 - 移除原代码中逐个输出字符计数和奇偶的逻辑,改为遍历过程中更新标记。
- 用
fgets()替代已废弃的gets()函数,避免缓冲区溢出风险,并处理输入末尾的换行符。 - 遍历完成后,根据两个标记的组合情况输出结果:
- 若两个标记都为1,说明既有偶数次字符也有奇数次字符,输出
both(两者皆有) - 仅
has_even为1,说明所有字符出现次数都是偶数,输出even(偶数) - 仅
has_odd为1,说明所有字符出现次数都是奇数,输出odd(奇数)
- 若两个标记都为1,说明既有偶数次字符也有奇数次字符,输出
内容的提问来源于stack exchange,提问作者John Lynard Isip
相关产品推荐
相关产品推荐

