Giải thuật dùng con trỏ và ký tự null(‘\0’) để lấy Họ, Tên, Đệm từ chuỗi Họ và Tên ở trong C

11:22 24/10/2024

Ở phần trước chúng ta đã học cách dùng hàm strtok() trong c để lấy ra Họ, Tên, Đệm trong chuỗi Họ tên nhập vào từ bàn phím. Trong bài viết này, chúng ta sẽ tìm hiểu về cách dùng biến con trỏ và ký tự null(\0’) để  lấy ra Họ, Tên, Đệm.

  1. Khai báo 1 mảng để minh họa

Giả sử ta có chuỗi sau 

char  a[ ] = “   HO   VA TEN   “;

char  *ptr = a;

Và giả sử đã cắt các khoảng trắng thừa chuỗi( tham khảo bài Xóa các khoảng trắng thừa trong chuỗi)

2. Lấy Tên trong chuỗi

Dùng hàm strrchr(a, ‘ ‘) để tìm khoảng trắng cuối cùng trong chuỗi

Gán ký địa chỉ của ký tự kế tiếp sau ký tự trắng’\0’ vào nội dung con trỏ

3. Lấy Họ trong chuỗi

Dùng hàm Strchr (a,’ ‘) để tìm khoảng trắng đầu tiên

Gán ký tự ‘\0’ cho khảng trắng này

4. Lấy Họ Đệm trong chuỗi

Dùng srtchr(a,’ ‘) để tìm khoảng trắng đầu tiên

Gán địa chỉ của ký tự kế tiếp cho con trỏ

Dùng strrchr(a,’ ‘) để tìm khaongr trắng cuối cùng

Gán ký tự ‘\0’ cho khoảng trắng này

5. Code chương trình

  1. #include <stdio.h>
  2. #include <string.h>
  3. char a[50];
  4. char *ptr = a;
  5. void NhapChuoi()
  6. {
  7.     printf(“Nhap chuoi: “);
  8.     gets(a);
  9.     puts(“Chuoi vua nhap”);
  10.     puts(ptr);
  11. }
  12. void XoaKhoangTrangDauChuoi()
  13. {
  14.     puts(“Loai bo khoang trang dau chuoi”);
  15.     int i = 0;
  16.     while (a[i] == ‘ ‘)
  17.         i++;
  18.     ptr = &a[i];
  19.     strcpy(a, ptr); // Gán chuỗi đã loại bỏ khoảng trắng đầu vào chuỗi ban đầu
  20.     puts(a);
  21. }
  22. void XoaKhoangTrangCuoiChuoi()
  23. {
  24.     puts(“Loai bo khoang trang cuoi chuoi”);
  25.     int i = strlen(a) – 1;
  26.     while (a[i] == ‘ ‘)
  27.         i–;
  28.     a[i + 1] = \0;
  29.     puts(a);
  30. }
  31. void XoaKhoangTrangThuaTrongChuoi()
  32. {
  33.     puts(“Loai bo khoang trang thua giua cac tu”);
  34.     //(giữa các từ chỉ cách nhau 1 khoảng trắng)
  35.     for (int i = 0; a[i] != \0; i++)
  36.     {
  37.         if (a[i] == ‘ ‘ && a[i + 1] == ‘ ‘)
  38.         {
  39.             for (int j = i + 1; a[j] != \0; j++)
  40.             {
  41.                 a[j] = a[j + 1]; // dịch sang trái
  42.             }
  43.             i–;
  44.         }
  45.     }
  46.     puts(a);
  47. }
  48. void LayHoTrongHoVaTen()
  49. {
  50.     char b[50];
  51.     strcpy(b, a);
  52.     ptr = b;
  53.     int i = strchr(b, ‘ ‘) – b;
  54.     b[i] = \0;
  55.     printf(“Ho: “);
  56.     puts(ptr);
  57. }
  58. void LayTenTrongHoVaTen()
  59. {
  60.     char b[50];
  61.     strcpy(b, a);
  62.     ptr = b;
  63.     int i = strrchr(b, ‘ ‘) – b;
  64.     ptr = &b[i + 1];
  65.     printf(“Ten: “);
  66.     puts(ptr);
  67. }
  68. void LayHoLotTrongHoVaTen()
  69. {
  70.     char b[50];
  71.     strcpy(b, a);
  72.     int i = strchr(b, ‘ ‘) – b;
  73.     int j = strrchr(b, ‘ ‘) – b;
  74.     if (i == j)
  75.         printf(“Lot: Khong co”);
  76.     else
  77.     {
  78.         while (b[i] == ‘ ‘)
  79.             i++;
  80.         ptr = &b[i];
  81.         while (b[j] == ‘ ‘)
  82.             j–;
  83.         b[j + 1] = \0;
  84.         printf(“Lot: “);
  85.         puts(ptr);
  86.     }
  87. }
  88. main()
  89. {
  90.     NhapChuoi();
  91.     XoaKhoangTrangDauChuoi();
  92.     XoaKhoangTrangCuoiChuoi();

    XoaKhoangTrangThuaTrongChuoi();

    LayHoTrongHoVaTen();

    LayTenTrongHoVaTen();

    LayHoLotTrongHoVaTen();

}

Qua bài viết này, hy vọng sinh viên đã có được cái nhìn tổng quát về cách dùng con trỏ và ký tự Null trong ngôn ngữ C. 

Giảng viên Bùi Tuấn Vũ
Bộ môn Ứng dụng phần mềm
FPT Polytechnic TP HCM

Cùng chuyên mục

Đăng Kí học Fpoly 2024

  • Max. file size: 50 MB.
  • Max. file size: 50 MB.
  • Max. file size: 50 MB.