在字符串中找出第一个只出现一次的字符
比如输入"abaccdeff",则输出’b’
首先我们需要一个字符数组来保存结果
char a[256];
最核心的思想是每个字符都有其对应的ASCII码值,所以我们可以将每个字符对应的ASCII码值作为下标.这样我们在遍历字符串时,每次遇到相应的字符就给其自增1.
a[*str]++;
举例来说明,假如我们输入的是"abaccdeff".遍历字符串时第一个字符为a,a对应的ASCII码值为97,我们所做的就是给a[97]++(这里注意我们一开始将字符数组全部初始化为0),这样在遍历字符串的时候只要遇到字符’a’我们就给a[97]++,最终就能得到在字符串中字符’a’出现的次数.
还要注意的一点是,我们在进行字符串的遍历时,改变了指针的位置(str++改变个指针位置),因此我们需要创建一个指针记录str首元素的位置.
char* tmp = str;
这样我们在做完第一次字符串遍历统计出各字符出现次数时,只需再讲str指针指向我们之前用tmp记录的位置,就可再进行字符串的第二次遍历,只要有一个字符的出现次数为1,就实现的题目中的要求
while (*str){
if (a[*str] == 1){ //出现次数为1的第一个字符
return *str;
}
str++; //记得给str++遍历字符串
}
完整代码如下
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
char FindChar(char* str){
char a[256] = { 0 };
char* tmp = str; //记录str首元素位置
while (*str){
a[*str]++; //遍历统计各个字符出现的次数
str++;
}
str = tmp; //让str重新指向首元素位置
while (*str){
if (a[*str] == 1){ //出现次数为1的第一个字符
return *str;
}
str++; //记得给str++遍历字符串
}
return 0;
}
int main(){
char str[] = "";
char c;
printf("请输入一些字符: ");
scanf("%s", str);
c = FindChar(str);
if (c){
printf("%c\n", c);
}
else {
printf("字符串中不存在只出现一次的字符!\n");
}
system("pause");
return 0;
}