链接想好几个难点

1 输入了几个字符=>写个循环得出

2 怎么防止重复访问=>用变量visit记录,在输出的时候改变visit链接

3 怎么找相同的=>用两个循环(暴力匹配)

4 输出格式=>

第一行:单独输出

第二行到n行,之前加个‘,’

最后一行加‘\n’怎么办 =>用变量记录最后一个同类的下标,不是0,就输出换行

//
// Created by Administrator on 2023/3/8.
//
#include <cstdio>
struct keyLine{
    char key;
    int visit = 0;//未被同类访问
    int seq;//记录下标
};
int main(){
    char arr[100] = {0};
    while (scanf("%s", arr) != EOF){
        int n = 0;//记录字符个数
        for(int i = 0; i < 100; ++i){//算几个字符
            if(arr[i] != '\0'){
                ++n;
            }else{
                break;
            }
        }
        keyLine data[n];
        for (int i = 0; i < n; ++i) {//存好结构体
            data[i].key = arr[i];
            data[i].seq = i;
        }
        for(int i = 0; i < n; ++i){
            int out = 0;//记录最后一个序号,如果不为0,那就说明输出了,打个\n
            for(int j = i; j < n; ++j){
                if(data[i].key == data[j].key && i != j){
                    if(data[i].visit != 1){//输出第一个
                        printf("%c:%d", data[i].key, data[i].seq);
                        data[i].visit = 1;//输出了就把遍历置1
                    }
                    if(data[j].visit != 1){//输出跟第一个一样的字符
                        printf(",%c:%d", data[j].key, data[j].seq);
                        out = j;
                        data[j].visit = 1;
                    }
                }
            }
            data[i].visit = 1;//不管怎样都要把遍历置1
            if(out != 0){
                printf("\n");
            }
        }
    }
    return 0;
}