30/09/2018, 16:17

Hàm thao tác trên chuỗi

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

int main()
{
	char *s = "They are dogs, cats. The dogs"; char *sep = " ,.";
	char *word = strtok(s, sep);
	while (word != NULL){
		printf("%s
", word);
		word = strtok(NULL, sep);
	}
	getch();
	return 0;
}

Em có đoạn code này, kết quả sau khi chạy sẽ là They, are, dogs,… tách từng từ ra. Em chưa hiểu lắm nên định debug thử, nhưng chạy trên C-Free thì Console nó bị stopped working, còn chạy trên VS2013 thì bị lỗi _CRT__NO__WARNINGS.
Ai cho em hỏi chỗ vòng lặp while tại sao ban đầu mình đưa tham số vào là chuỗi s nhưng sau lại đưa vào NULL.

X viết 18:24 ngày 30/09/2018

“!= NULL” mà =))
lỗi kia thì vào thử project properties -> linker -> chỗ “enable incremental linking” chọn NO

Đoàn Hiếu Tâm viết 18:30 ngày 30/09/2018

Không phải. Trong vòng lặp kìa

word = strtok(NULL, sep);
X viết 18:23 ngày 30/09/2018

có gì đó hơi lạ ở đây @@

X viết 18:23 ngày 30/09/2018

hàm tok tìm blankspace gán cho sep, sau đó lấy thằng NULL gán cho thằng blankspace sau sep, => lần lặp sau nó sẽ dùng thằng NULL như thằng tok =))) hiểu nhưng giải thích chắc không ai hiểu

Minh Hoàng viết 18:29 ngày 30/09/2018
char s[100] = "They are dogs, cats. The dogs"; char *sep = " ,.";

thế mới chuẩn, xem con trỏ hằng và hằng con trỏ để biết thêm chi tiết

Minh Hoàng viết 18:18 ngày 30/09/2018

Về câu hỏi thứ 2 của bạn tại sao lại word = strtok(NULL, sep); thì nên xem lại cách dùng strtok cho chính xác, mình nói nôm na thế này thôi.
strtok với lời gọi đầu tiên char *word = strtok(s, sep); sẽ gán các sep tìm thấy được thành '\0' và word sẽ trỏ tới vị trí đầu tiên của s.
với lời gọi thứ 2 trở đi thì mình sẽ không truyền một chuỗi nào khác vào và word sẽ di chuyển từ vị trí cũ lên cho tới khi gặp vị trí sau cái '/0'(do đó chuyền NULL vào) => nó là thế

Bài liên quan
0