Bài tập liên quan đến strtok trong C Pig Latin

Mình đang làm 1 bài liên quan đến việc biến đổi chữ tiếng Anh thành Pig Latin, đại khái là chữ cái đầu chuyển xuống cuối và thêm ay.
Ví dụ " hello moi nguoi" sẽ thành " ellohay oihay guoinay ".
Mình có nghĩ đến việc sử dụng strtok để tách ra từng chữ. Mình thử đọc về strtok nhưng chưa hiểu lắm cách nó hoạt động. Chẳng hạn mình có thể hiểu cách nó tách ra từ đầu tiên, nhưng từ tiếp theo nó sử dụng token = strtok(NULL, " ") mình không hiểu ở đoạn này.
Mình cảm ơn trước
l1

#include<stdio.h>
#include <string.h>
void printPigLatin( char *word );
int main() 
{
    char string[50];
    gets(string);
    printf("%s\n", string);

    char * token = strtok(string, " ");

    while( token != NULL ) 
    {
        printPigLatin(token);
        token = strtok(NULL, " ");
    }

}

    void printPigLatin( char *word )
    {
        char temp[50];

        for( int i = 0; *word != '\0';  i++ )
        {
            temp[i] = word[i + 1];
        }

        strcat( temp, "ay" );
        printf("%s", temp);
    }

Code của em nhưng không biết em bị lỗi chỗ nào lại chạy không được

Theo strtok manual:

Parameters
str
C string to truncate.
Notice that this string is modified by being broken into smaller strings (tokens).
Alternativelly, a null pointer may be specified, in which case the function continues scanning where a previous successful call to the function ended.

Khi cậu truyền NULL vào argument đầu tiên, hàm này sẽ tiếp tục scan từ lần gọi thành công trước (cậu biết strtok sẽ đổi ký tự phân tách thành NULL rồi chứ? Hàm này sẽ gọi tiếp sau index của ký tự đã bị chuyển thành NULL).

Ở hàm in ký tự heo, cậu nên duyệt i từ 0 tới strlen(word) - 2 sẽ tốt hơn, gán chữ cái đầu tiên xuống cuối xâu temp, và nhớ gán null xuống cuối xâu trước khi dùng strcat
Cậu cũng có thể cân nhắc dùng sprintf thay cho strcat.

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