Tách Các Từ Trong Chuỗi [Archive] - Diễn Đàn Tin Học

Diễn Đàn Tin Học > Lập trình > Các ngôn ngữ lập trình > C/C++ > Tách các từ trong chuỗi PDA

View Full Version : Tách các từ trong chuỗi

thinhit30-08-2009, 11:22Đề bài : Nhập vào 1 chuỗi , sau đó tách các từ trong chuỗi ra Ví dụ : Chao mung ban den voi website Tách thành : chao mung ban den voi website Chú ý : tách các từ ấy ra nhưng vẫn lưu trữ được ,mình chỉ biết cách nó xuất ra thôi còn làm thế nào để lưu trữ từng từ thì chịu. cám ơn nhé . tronglinh8930-08-2009, 12:31chac' la` lưu mỗi từ vao` 1 chuỗi mới! quangtq30-08-2009, 15:44Sặc. Có gì đâu, mình đưa cái thuật toán ra thôi: i=0; 1. Duyệt xâu từ i đến khi gặp dấu space, vị trí là k. Lưu xâu từ vị trí i đến k-1 vào mảng. 2. Gán i=k+1, lặp lại như trên đến khi xâu hết xâu. thinhit30-08-2009, 17:43làm thế này thì nó cũng chỉ lưu được 1 xâu thôi cậu à ? xelnaga31-08-2009, 01:45làm thế này thì nó cũng chỉ lưu được 1 xâu thôi cậu à ? dùng hàm strtok() trong <cstring> ý buidangmanh06-09-2009, 14:21Bài này trước học C cũng ko làm được 1 thời gian sau ôn lại C tự nhiên lại làm được. Nó cũng ko khó đâu Mục tiêu bài này là mỗi 1 chữ trong 1 chuỗi là phải kích suống dòng do đó ta dựa vào dấu cách để bắt nó. Nếu ko bắt được dấu cách nào thì in ra chuỗi đó #include <stdio.h> #include <conio.h> #include <string.h> void main(){ char chuoi[100]; printf("nhap Chuoi: "); gets(chuoi); for(int i=0;i<strlen(chuoi);i++){ if(chuoi[i]==' '){ printf("\n"); } else{ printf("%c",chuoi[i]); } } getch(); } tronglinh8906-09-2009, 19:18Bài này trước học C cũng ko làm được 1 thời gian sau ôn lại C tự nhiên lại làm được. Nó cũng ko khó đâu Mục tiêu bài này là mỗi 1 chữ trong 1 chuỗi là phải kích suống dòng do đó ta dựa vào dấu cách để bắt nó. Nếu ko bắt được dấu cách nào thì in ra chuỗi đó #include <stdio.h> #include <conio.h> #include <string.h> void main(){ char chuoi[100]; printf("nhap Chuoi: "); gets(chuoi); for(int i=0;i<strlen(chuoi);i++){ if(chuoi[i]==' '){ printf("\n"); } else{ printf("%c",chuoi[i]); } } getch(); } ẹc! code này chỉ xuất ra chứ đâu có nuu nại đâu :-> [=========> Bổ sung bài viết <=========] Sặc. Có gì đâu, mình đưa cái thuật toán ra thôi: i=0; 1. Duyệt xâu từ i đến khi gặp dấu space, vị trí là k. Lưu xâu từ vị trí i đến k-1 vào mảng. cái nay` ban lưu băng` cách nao` vậy? vanquyenhp07-09-2009, 01:32Có phải bạn muốn tách từng từ ra, sau đó vẫn lưu được từng từ đó chứ gì. Bạn dùng thuật toán để tách từng từ ra. Sau khi tách được 1 từ thì dùng danh sách liên kết để lưu từng từ đó lại. Cái hay của danh sách liên kết là không phải khai báo độ rộng như mảng, nó lưu được thoải mái, tùy vào dung lượng bộ nhớ (với bộ nhớ hiện nay thì không sợ thiếu). quangtq07-09-2009, 18:28Lưu = cách nào? S1[i] = S2[j] i,j chạy // tronglinh8909-09-2009, 13:38Có phải bạn muốn tách từng từ ra, sau đó vẫn lưu được từng từ đó chứ gì. Bạn dùng thuật toán để tách từng từ ra. Sau khi tách được 1 từ thì dùng danh sách liên kết để lưu từng từ đó lại. Cái hay của danh sách liên kết là không phải khai báo độ rộng như mảng, nó lưu được thoải mái, tùy vào dung lượng bộ nhớ (với bộ nhớ hiện nay thì không sợ thiếu).khi gặp khoảng trắng thì chuyển toàn bộ các từ đã duyệt vào một node như vậy thì ok roi`. muốn lấy nội dung của chuỗi nào đó chỉ việc truy xuất nội dung của node đó. [=========> Bổ sung bài viết <=========] Lưu = cách nào? S1[i] = S2[j] i,j chạy // còn cách này bạn nói rõ hơn dc ko, rốt cuộc khi muốn lấy 1 trong các mãng đã lưu thì bạn gọi như thế nào, ví dụ muốn xuất mình từ 'mừng' thì làm sao dc ??? quangtq09-09-2009, 18:40for (i=0; i<strlen(s1); i++) s2[j++]=s1[i]; Tạo 1 mảng, mỗi pt là 1 từ. Pt thứ nhất là từ thứ nhất (cách lưu như trên), tương tự. Xuất ra từ thứ n thì xuất s[n]. [=========> Bổ sung bài viết <=========] for (i=0; i<strlen(s1); i++) s2[j++]=s1[i]; Tạo 1 mảng, mỗi pt là 1 từ. Pt thứ nhất là từ thứ nhất (cách lưu như trên), tương tự. Xuất ra từ thứ n thì xuất s[n]. kangoo170712-09-2009, 00:11Thật là phí và chậm nếu dùng DSLK hay mảng 2 chiều. Mình dùng mảng số 1 chiều kiểu char(hoặc short) để mô tả về chính cái chuỗi đó void main() { char *s="Chao cac ban"; char a[10], k=1; a[0]=0; for(int i=0; i<strlen(s); ++i) if(s[i]==' ') { a[k]=++i; ++k; } for(int i=0; i<k-1; ++i) { for(int j=a[i]; j<a[i+1]-1; ++j) printf("%c", s[j]); printf("\n"); } printf("%s\n", s+a[k-1]); } Cái mảng a dùng để lưu vị trí của các ký tự trắng, tức là vị trí bắt đầu và kết thúc của 1 từ trong chuỗi s. Khi in ra thì in những ký tự s nằm giữa 2 vị trí ký tự trắng (a[i] và a[i+1]) Trong chuỗi "Chao cac ban" thì ta sẽ dc mảng a={0, 5, 9} chữ "Chao" là 0->5, chữ "cac" là 5->9, còn chữ "ban" thì từ 9->hết chuỗi Vậy cái mảng a chính là metadata - thông tin tự mô tả của chuỗi s. Nhược điểm nằm ở chỗ chuỗi s ban đầu phải luôn tồn tại Để tìm từ thứ k(k bắt đầu từ 1) thì ta xuất các ký tự từ s[a[k-1]] đến s[a[k]] hoa_pro9011-12-2009, 09:37ban kangoo1707 oi.Cai' do' cua ban thi no chua luu ra duoc ket' qua dau. Neu' dua vao mot ham` con de su dung sau thi` khong on. Minh de` xuat' su dung linklist. Gacon_thh11-12-2009, 11:04Nếu lưu lại để sử dụng về sau thì chỉ có xài dslk (linklist) bằng cách cài đặt cây là tiện nhất. Còn muốn đơn giản thì lưu vào mảng cũng đc. Mình cũng vừa làm một bài tập tương tự. <Đọc văn bản từ file text hoặc từ bàn phím sau đó lưu từng từ lại và đếm số lần xuất hiện của mỗi từ.> Có lẽ khi học tới BST thì dạng bài này rất phổ biến. Code nó hơi phức tạp. Mình nghĩ là nếu lấy từng từ trong chuỗi thì phải xét rất nhiều trường hợp nữa ví dụ như dấu chấm câu, dấu phẩy, hai chấm .v.v... ('.' ',' ':' ';' ...) không đơn giản chỉ là có mỗi dấu cách như các bạn nói đâu. Tuy nhiên việc này thì cũng tùy yêu cầu của đề bài. Lúc nào rảnh mình code lại cho bạn tham khảo. tandangminh19-05-2012, 12:15// Lay day so tu mot string duoc danh vao : "12, 56, 75 , 45, 43, 6" //int Lv[64],nLv; //nLv=GetNumberList(txtleveltype,Lv); Public int GetNumberList(char *s,int *LevelArr) { char *p,*b; int n=0; b=s; p=strchr(s,','); while(p!=NULL) { *p='\0'; *(LevelArr+n) = atoi(b); n++; b=p+1; p=strchr(b,','); } *(LevelArr+n) = atoi(b); n++; return n; } Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.

Từ khóa » Hàm Tách Chuỗi C++