0965303260
TP. Hồ Chí Minh

[C]. Chuẩn Hóa Tên Và Email

Chuẩn hóa tên là một công việc thường gặp khi xử lý chuỗi, trong bài viết này mình sẽ hướng dẫn các bạn phương pháp để bạn có thể chuẩn hóa tên theo nhiều yêu cầu khác nhau

NỘI DUNG : 

  • Bài toán chuẩn hóa tên 1
  • Bài toán chuẩn hóa tên 2
  • Bài toán cấp email theo tên
  • Video tutorial

chuẩn hóa tên

1. Bài toán chuẩn hóa tên 1

Bài toán này sẽ yêu cầu bạn chuẩn hóa tên bằng cách loại bỏ dấu cách thừa giữa các từ và viết hoa chữ cái đầu của từng từ.

Ví dụ "   nguYEN   Thuy  linH" => "Nguyen Thuy Linh"

Phương pháp làm những bài toán chuẩn hóa tên đó là bạn nên tách từng từ ra sau đó xử lý từng từ và gộp lại

Nếu bạn chưa học phương pháp tách từ trong xâu thì bạn có thể tham khảo tại đây

Code : 

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "ctype.h"

//Hàm này chuẩn hóa từng từ : liNH => Linh
char* chuanHoaTu(char *s){
    s[0] = toupper(s[0]);
    for(int i = 1; i < strlen(s); i++){
        s[i] = tolower(s[i]);
    }
    return s;
}

int main(){
    char s[1000] = "NGuyeN   vAN   hOANg  ";
    char res[1000] = "";
    char *token = strtok(s, " ");
    while(token != NULL){
        //nối từ vào chuỗi kết quả res
        strcat(res, chuanHoaTu(token));
        token = strtok(NULL, " ");
        //Nếu chưa phải từ cuối thì nối thêm dấu cách
        if(token != NULL){
            strcat(res, " ");
        }
    }
    printf("Ten sau khi chuan hoa:\n");
    printf("%s\n", res);
    return 0;
}

Output : 

Ten sau khi chuan hoa:
Nguyen Van Hoang

Bạn có thể in ra luôn token tách được sau khi chuẩn hóa hoặc lưu vào xâu kết quả như mình rồi in ra sau.

Code dưới đây mình sẽ viết 1 hàm trả về chuỗi tên chuẩn hóa, các bạn có thể lựa chọn cách mà mình thấy phù hợp

Code : 

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "ctype.h"

//Hàm này chuẩn hóa từng từ : liNH => Linh
char* chuanHoaTu(char *s){
    s[0] = toupper(s[0]);
    for(int i = 1; i < strlen(s); i++){
        s[i] = tolower(s[i]);
    }
    return s;
}

char *chuanHoaTen(char *s, char *res){
    char *token = strtok(s, " ");
    while(token != NULL){
        //nối từ vào chuỗi kết quả res
        strcat(res, chuanHoaTu(token));
        token = strtok(NULL, " ");
        //Nếu chưa phải từ cuối thì nối thêm dấu cách
        if(token != NULL){
            strcat(res, " ");
        }
    }
    return res;
}

int main(){
    char s[1000] = "NGuyeN   vAN   hOANg  ";
    char res[1000] = "";
    printf("Ten sau khi chuan hoa:\n");
    char *name = chuanHoaTen(s, res);
    printf("%s\n", name); // res <=> name
    return 0;
}

Output : 

Ten sau khi chuan hoa:
Nguyen Van Hoang


2. Bài toán chuẩn hóa tên 2

Bài toán này yêu cần bạn in ra tên trước rồi mới tới họ và đệm 

Ví dụ "tran    VaN  TeCH28" => "Tech28 Tran Van"

Trong trường hợp bài toán chuẩn hóa tên yêu cầu bạn in ra thứ tự từ không như ban đầu thì ta nên lưu lại các từ vào mảng 2 chiều, điều này sẽ thuận tiện hơn cho việc in ra từ nào trước từ sao sau.

Nếu bạn chưa biết cách lưu lại các từ trong xâu vào mảng 2 chiều thì bạn có thể tham khảo tại đây

Code : 

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "ctype.h"

//Hàm này chuẩn hóa từng từ : liNH => Linh
char* chuanHoaTu(char *s){
    s[0] = toupper(s[0]);
    for(int i = 1; i < strlen(s); i++){
        s[i] = tolower(s[i]);
    }
    return s;
}

int main(){
    char s[1000] = "NGuyeN   vAN   hOANg  ";
    char a[100][50];
    int n = 0; // đếm số từ
    char *token = strtok(s, " ");
    while(token != NULL){
        strcpy(a[n], chuanHoaTu(token));
        ++n;
        token = strtok(NULL, " ");
    }
    printf("Ten sau khi chuan hoa :\n");
    //In ra tên trước
    printf("%s ", a[n - 1]); //từ cuối cùng ở dòng n - 1
    for(int i = 0; i < n - 1; i++){
        printf("%s", a[i]);
        if(i != n - 2){
            printf(" ");
        }
    }
    return 0;
}

Output : 

Ten sau khi chuan hoa :
Hoang Nguyen Van

Bằng cách lưu từng từ trong tên vào mảng thì bạn có thể chủ động trong việc in ra theo thứ tự mà đề bài yêu cầu.



3. Bài toán cấp email theo tên

Bài toán cấp email thường gặp khi bạn cần cung cấp email cho các nhân viên trong 1 công ty hay các sinh viên trong trường đại học dựa trên tên của họ. 

Ví dụ tên "Nguyen Van Nam" sẽ được cấp email là "namnv@28tech.com.vn" chẳng hạn

Tên email được cấp bằng cách lấy tên và ghép với các chữ cái đầu tiên của họ và đệm.

Có nhiều kiểu cấp email khác nhau nhưng bạn có thể làm tương tự kiểu chuẩn email này.

Code : 

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "ctype.h"

int main(){
    char s[1000] = "NGuyeN   vAN   NaM  ";
    for(int i = 0; i < strlen(s); i++){
        s[i] = tolower(s[i]);
    }
    char a[100][50];
    int n = 0; // đếm số từ
    char *token = strtok(s, " ");
    while(token != NULL){
        strcpy(a[n], token);
        ++n;
        token = strtok(NULL, " ");
    }
    printf("Email duoc cap :\n");
    printf("%s", a[n - 1]);
    for(int i = 0; i < n - 1; i++){
        printf("%c", a[i][0]);
    }
    printf("@28tech.com.vn\n");
    return 0;
}

Output : 

Email duoc cap :
namnv@28tech.com.vn


Video hướng dẫn chuẩn hóa tên : 

KTIxglnijsg