Code đếm kí tự khác nhau trong chuỗi C bị sai kết quả

> void demkhac(char s[100]){
> 	int dem=0;
> 	for(i=1;i<strlen(s)-1;i++){
> 		if(s[0]!=s[i]){
> 			dem++;
> 		}
> 	}
> 	printf("So ki tu khac nhau la : %d", dem);
> }
1 Like

Cho e hỏi là tại sao em dùng hàm này để đếm kí tự khác nhau lại không ra kết quả đúng :frowning: .Em so sánh kí tự đầu với các kí tự sau khác thì tăng biến đếm, nhưng tại sao lại không được ạ.Nếu sai code thì sửa lại giùm em ạ. Em mới học mong mọi người giúp đỡ :smile:

đơn giản mà: char thuộc [0,255] nên dùng mảng đếm là dc

int dem(char *s){
    int mark[256];
    memset(mark,0,sizeof(mark));
    while(*s){
          mark[*s]++;s++;
    }
    int res=0,i;

    for(i=0;i<256;i++) res+= mark[i]!=0;
    return res;
}
1 Like

:slight_smile: hazz khó thật. thank b

Chắc vấn đề được solve rồi nhưng mình cũng xin mở rộng lên tập ký tự unicode luôn :smile:
Sử dụng bảng băm để code đơn giản hơn:

int Đếm_Ký_Tự_Khác_Nhau(wchar_t* str)
{
     std::unordered_set<wchar_t> allChar;
     while ((*str) != L'\0')
     {
          if (allChar.find(*str) == allChar.end())
          {
                allChar.emplace(*str);
          }
          str++;
     }
     return allChar.size();
}
2 Likes

nói thật mk ms hk lên chả bíêt bạn viết j luôn :confounded:

Sorry mình tưởng C++, post xong nhìn lại tag mới té ra là C :sweat_smile:
Cơ bản thì allChar của mình là 1 bảng băm (kiểu là std::unordered_set), tác dụng của nó là làm 1 cái kho lưu trữ những ký tự đã gặp khi duyệt chuỗi ký tự.
allChar.find == allChar.end sẽ là true khi ký tự đó chưa từng nằm trong kho.
emplace để bỏ ký tự đó vào kho.
return allChar.size là số lượng các ký tự đã bỏ vào trong kho.

2 Likes

mình test thử thì ok , bạn xem lại nha

#include "stdafx.h"
#include<iostream>
#include<conio.h>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	char s[50];
	do
	{
		cout << " nhap chuoi ki tu : ";
		cin.getline(s, 50);
		cout << " chuoi vua nhap : ";
		cout << "*" << s << "*" << endl;
		// đếm kí tự phân biệt trong chuỗi 
		char a[50];
		int na = 0;
		int i = 0;
		while (i < strlen(s) && (s[i] == 32 || s[i] == NULL))
			i++;
		if (i>strlen(s))cout << " chuoi khong co ki tu " << endl;
		else
		{
			int dem = 0;
			s[i] = a[na++];
			for (; i < strlen(s); i++)
			{
				if (s[i] != 32 && s[i] != NULL)
				{
					int kt = 1;
					for (int j = 0; j < na; j++)
					{
						int kt = 1;
						if (s[i] == a[j])
						{
							kt = 0;
							break;
						}
					}
					if (kt == 1)
					{
						dem++;
						s[i] = a[na++];
					}
				}
			}
			cout << " so ki tu khac nhau la : " << dem << endl;
		}
	} while (_getch() != 27);
	return 0;
}
1 Like

mk đã hk c++ đâu :persevere:

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