30/09/2018, 19:01

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);
> }
Viruts viết 21:14 ngày 30/09/2018

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 .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 đỡ

Gió viết 21:11 ngày 30/09/2018

đơ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;
}
Viruts viết 21:14 ngày 30/09/2018

hazz khó thật. thank b

明玉 viết 21:09 ngày 30/09/2018

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
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();
}
Viruts viết 21:15 ngày 30/09/2018

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

明玉 viết 21:08 ngày 30/09/2018

Sorry mình tưởng C++, post xong nhìn lại tag mới té ra là C
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.

Nhóc Lãng Tử viết 21:02 ngày 30/09/2018

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;
}
Viruts viết 21:04 ngày 30/09/2018

mk đã hk c++ đâu

Bài liên quan
0