构造结构体iChar,记录每个字符在串中的位置和第一次出现的位置
之后按照字符进行排序,再用双指针按要求打印即可


#include<stdio.h>
#include<algorithm>

using namespace std;





struct iChar {
	char c;
	int pos;
	int first; 
};
bool sortByChar(iChar a,iChar b){//要按照在原本序列中第一次出现的顺序对所有字母进行排序 
	if(a.first==b.first){
		return a.pos<b.pos;
	} else {
		return a.first<b.first;
	}
}
int first(char input[],int n,char search){
	for(int i=0;i<=n;i++)
		if(input[i]==search) return i;
	return -1;
}
int main(){//习题3.7  华中科大  找位置 
	char input[100];
	iChar data[100];
	while(scanf("%s",input)!=EOF){
		int n=0;
		for(;n<100 && input[n]!='\0';n++){
			data[n].c = input[n];
			data[n].pos = n;
            data[n].first = first(input,n,input[n]);//最差也就是到自己,所以不需要等遍历完再逐个建立first 
        }
		sort(data,data+n,sortByChar);
		
		int i=0,j=0;
		while(i<n){//双指针步进,i是本字符的第一个,j是下一种字符的第一个
			while(j<n && data[i].c==data[j].c) j++;
			if(i+1==j){//i对应的字母没有重复 
				i = j; 
			} else {
				while(i<j){//有重复的字母,逐个输出 
					printf("%c:%d",data[i].c,data[i].pos);
					i++;
					if(i<j){
						printf(",");
					} else {
						printf("\n");
					}
				}
			}  
		}
	}

    return 0;
}