Đếm số lần xuất hiện của từng phần tử trong chuỗi

Mấy anh/chị cho em hỏi khi em nhập chuỗi vào thì khi đếm số lượng phần tử trong chuỗi thì có vẻ như nó đếm luôn dấu Enter đúng không ạ? Em ko biết phải sửa lại như thế nào ạ?
Code của em:

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
#define MAX 300

void DemKyTu(char s[]);
int myStrlen(char s[], int k);

int main()
{
    char s[MAX];
    fgets(s,MAX,stdin); //Nhap chuoi s
    DemKyTu(s);
    return 0;
}
void mangKyTuPhanBiet(char *s, char *s1){
    int n=0;
    s1[n++]=s[0];
    for (int i=1; s[i]!='\0'; i++){
        int check=1;
        for (int j=i-1; j>=0; j--){
            if (s[i] == s[j]){
                check=0;
                break;
            }
        }
        if (check == 1){
            s1[n++]=s[i];
        }
    }s1[n]='\0';
}
void DemKyTu(char *s){
    char s1[MAX];
    mangKyTuPhanBiet(s,s1);
    for (int i=0; i<myStrlen(s1,0); i++){
        int dem=0;
        for (int j=0; j<myStrlen(s,0); j++){
            if (s1[i]==s[j])
                dem++;
        }
        cout<<s1[i]<<": "<<dem<<"\n";
    }
}
int myStrlen(char *s, int k){
    for (; s[k]!='\0'; k++);
    return k;
}

Output của đề bài:
2da393c062a3affdf6b2
Output của em:

vậy thì bạn cần xem lại xử lý ở bước nhập, loại bỏ enter chẳn hạn?

2 Likes

Vấn đề nằm ở hàm fgets nó đọc cả kí tự xuống dòng luôn.
https://www.cplusplus.com/reference/cstdio/fgets/

A newline character makes fgets stop reading, but it is considered a valid character by the function and included in the string copied to str .

Đoạn mã của bạn đếm tất cả các kí tự mà, muốn loại bỏ thì if - else hoặc xóa kí tự xuống dòng trước khi đếm.
Còn cách nữa là thay vì dừng duyệt chuỗi bằng \0 thì bây giờ dừng bằng \n.

3 Likes

Dạ em hiểu được vấn đề rồi, em cảm ơn ạ !!

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?