Thắc mắc về chương trình tách tên và họ lót trong C

Xin chào m.n, Như tiêu đề, em thắc mắc về chương trình tách tên và họ lót trong C , không biết chương trình họat động như thế nào ?
đây là code mẫu em kiếm trên google

#include < stdio.h > 
#include < conio.h > 
#include < string.h >

void tachten(char s[], char ten[], char lot[]) {
  int i, j, n;
  n = strlen(s);
  for (i = n - 1; i > 0; i--)
    if (s[i] == ' ')
      break;
  for (j = 0; j < i; j++)
    lot[j] = s[j];
    lot[i] = '\0';
  for (j = i + 1; j < n; j++)
    ten[j - i - 1] = s[j];
  ten[n - i - 1] = '\0';
}
void main(void) {
  char s[30], ten[20], lot[20];
  printf(" nhap ho va ten \n");
  gets(s);
  tachten(s, ten, lot);
  printf(" \n ho va chu lot: \n");
  puts(lot);
  printf(" ten: \n");
  puts(ten);
  getch();
}

Kết quả in ra thì đúng,nhưng em không hiểu ở function tachten[] nó họat động như thế nào, em ngồi suy mãi mà không ra mong anh chị giải đáp thắc mắc giúp em, em :smiley:xin cảm ơn :laughing:

  • Bạn sửa lại indent.
  • Code xấu quá :’(
  • Về cơ bản là tách giữa họ, đệm và tên có các dấu cách. Ví dụ, có 1 người tên Nguyễn Văn A thì Nguyễn là họ, Văn là đệm, A là tên, giữa họ và đệm, đệm và tên có 1 dấu cách. Vì thế, cứ đến một dấu cách nào đấy là hết 1 từ (bạn biết bài toán tách từ trong xâu không? Giữa 2 dấu cách là 1 từ, bài này cũng gần như vậy). Ta dễ tách tên khỏi xâu nhất, do vậy ta sẽ for từ cuối xâu về đầu xâu, gặp dấu cách đầu tiên thì dấu cách đó chính là dấu cách ngăn giữa tên và đệm (vị trí từ dấu cách đó -> cuối xâu là tên). Cứ tương tự cho đến khi ta tách hết được đệm và họ.
2 Likes

cảm ơn anh, Nghe anh giải thích thì em cũng hiểu được một phần rồi
nhưng còn ở đoạn code này nó hoạt động như thế nào ạ :slight_smile:

lên google gõ học học debug, chứ ko có code sẵn mà còn ko hiểu thì chết đấy

1 Like

Ví dụ:

Nguyen Van A
__________^_
   |      | \
 họ+đệm   i tên

i là vị trí của dấu cách đầu tiên kể từ bên phải (được xác định qua vòng for i ngược ở trên), vậy thì từ vị trí 0 (đầu tiên) đến vị trí i-1 là họ+đệm (vòng for(j=0; j<i; j++) thể hiện điều đó), vị trí lot[i] là vị trí kết thúc xâu char[] (theo lí thuyết về xâu) nên ta gán \0 (kí tự null)); vị trí i+1 đến cuối là tên (vòng for(j=i+1; j<n; j++) thể hiện điều đó), vị trí ten[n-i-1] cũng gán là null vì nó là vị trí kết thúc xâu.

Về kí tự null ở cuối xâu được thể hiện qua mảng char, bạn đọc lại lí thuyết (mình cũng không biết phải gọi nó là gì cho chính xác, tóm lại là ở cuối xâu có 1 kí tự null)

1 Like

cảm ơn anh, em đã hiểu rồi :smiley:

@Hoai_Nam_Truong: //tag để bạn nhớ đọc:

  • Lần sau nên đọc và ngẫm, không nên chỉ paste code lên đây và hỏi.
  • Indent cũng là một phương tiện giúp hiểu code dễ hiểu hơn (code không indent thế này đọc chỉ có ngu người).
  • Nên tìm nguồn code có cả tutorial sẵn để đọc (điều này tốt với newbie). Không nên tìm code xấu.
  • Nắm vững lí thuyết. Ví dụ như ở dòng gán null, nếu hiểu lí thuyết thì hiểu ngay được dòng này.
  • Code nhiều để khôn ra. Ít nhất thì code nhiều sẽ lên tay, tự tay mình code thuật toán sẽ vỡ ra nhiều điều: về phong cách code, về cấu trúc, về thuật toán,… và để hiểu thuật toán, không cần phải dạo lên mạng, đọc hết code nọ code kia về thuật toán mà chả sờ gì đến bàn phím. Đọc phải code mới ngấm được thuật toán, nếu chỉ đọc không cũng chỉ à à phút chốc rồi quên sạch.
  • Code nhiều thì sẽ biết debug (hoặc lên gg tham khảo cách debug code như @Dao_An chỉ dẫn). Có debug có “khôn”.
1 Like

code của mình như sau:

void splitName(char str[], char subA[], char subB[], char subC[], char letter)
{
    char *sub1 = strchr(str, letter);
    char *sub2 = strrchr(str, letter);

    /**Get the subA**/
    int size = strlen(str) - strlen(sub1);
    strncpy(subA, str, size);

    /**Get the subB**/
    size = strlen(sub1) - strlen(sub2) - 1;
    strncpy(subB, sub1 + 1, size);

    /**Get the subC**/
    strcpy(subC, sub2 + 1);
}

Kí tự 0x00 gọi là NUL :slight_smile: con trỏ mới là NULL.


Mà họ tên đầy đủ có thể có 4, 5, … chữ :smiley: thì tách kiểu gì nhỉ?

2 Likes

Em thấy code bác hay, nhưng nếu họ tên kiểu thiếu phần tử thì sẽ gây lỗi ngay
Ví dụ: Huỳnh Lập, Luân.

ten[j-i-1]=s[j];
ten[n-i-1]=’\0’;

đoạn này hoạt động sao vậy mn chỉ em với

Mình đã giải thích ở comment trên, bạn đọc lại nhé.

1 Like

em hiểu vòng lặp for nhưng em ko hiểu cái đoạn này ý ten[j - i - 1] = s[j];

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