Tách các từ trong chuỗi [Archive] – Diễn Đàn Tin Học

View Full Version : Tách những từ trong chuỗi

thinhit

Đề 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é .

tronglinh89chac ‘ la ` lưu mỗi từ vao ` 1 chuỗi mới !
quangtq

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.
2. Gán i=k+1, lặp lại như trên đến khi xâu hết xâu.

thinhitlàm thế này thì nó cũng chỉ lưu được 1 xâu thôi cậu à ?
xelnaga

là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 ý

buidangmanh

Bà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
#include
#include

void main(){
char chuoi[100];
printf(“nhap Chuoi: “);
gets(chuoi);
for(int i=0;i if(chuoi[i]==’ ‘){
printf(“\n”);
}
else{
printf(“%c”,chuoi[i]);
}
}
getch();
}

tronglinh89

Bà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
#include
#include

void main(){
char chuoi[100];
printf(“nhap Chuoi: “);
gets(chuoi);
for(int i=0;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?

vanquyenhp

Có 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).

quangtq

Lưu = cách nào?
S1[i] = S2[j]
i,j chạy //

tronglinh89

Có 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 ???

quangtq

for (i=0; 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

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].

kangoo1707

Thậ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
if(s[i]==’ ‘) {
a[k]=++i;
++k;
}
for(int i=0; i
for(int j=a[i]; 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_pro90

ban 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_thh

Nế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.

tandangminh

// 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 © 2022 vBulletin Solutions, Inc. All rights reserved .

Source: https://mix166.vn
Category: Thủ Thuật

Xổ số miền Bắc