uh thì chỉ cần 2 từ cách nhau bằng 1 khoảng trắng là ok roi
còn cắt đầu và cuối chuỗi thì mình làm được
Xoá khoảng trắng trong chuỗi
mình fix code của bạn kia thui
cơ mà thêm trường hợp riêng là được mà nhỉ
s[i+1]='\0'
cái này để xóa đuôi
s[0]=' '
cái này để xóa đầu
Có hàm nào để cắt chuỗi không nhỉ
Bạn xem hàm memmove nhé, viết khéo léo sẽ thành hàm xóa kí tự
xem hàm strtok, thường dùng để cắt chuỗi khi gặp kí tự ngắt
Giải thích em về hàm strtok dc không anh
http://www.cplusplus.com/reference/cstring/strtok/?kw=strtok
ví dụ có một câu "mot hai ba nam"
thì lần đầu tiên truyền chuỗi này vào hàm (kí tự delimiter là space ' '
) thì chuỗi còn "mot"
tuy nhiên các dữ liệu ở phía sau vẫn còn. Lý do là hàm strtok sẽ làm cho các kí tự space tìm được trở thành '\0'
. Lần gọi sau thì nó sẽ nhảy tới vị trí kế tiếp, con trỏ sẽ giữ địa chỉ của chuỗi “hai” (tất nhiên là dữ liệu của chuỗi vẫn còn). Đọc example trong link cho dễ hiểu.
Hàm này biến đổi chuỗi nên là chép chuỗi qua chuỗi khác rồi hẵng làm strtok
ồ, mở mang duoc kiến thức thank bác lần nữa
Bài này 1 vòng while là ra, sao lại phức tạp thế
#include <stdio.h>
#include <string.h>
int trim(char * s){
int d=0,i=0,prev=-1;
while(s[i]){
if(s[i]==' '&& (prev<0|| s[prev]==' ')){
d++;// 2 ' ' liên tiếp hoăc ' ' ở đầu chuỗi => tăng số kí tự bị xoá
}else{
s[i-d]=s[i];
prev=i;
}
i++;
}
i-=d;// i is new length
//trim right
if(i&& s[i-1]==' ') s[i-1]= 0,d++; else s[i]=0;
return d;
}
int main() {
char s[100]=" d a b ";
int d=trim(s);
printf("%s# deleted %d char(s)",s,d);
return 0;
}
quan trõng nghĩ ko ra vòng while :))
cái hàm strtok chạy ngược từ cuối chuỗi lên đầu chuỗi được không Rock_Hoang
while và for trong C có cấu trúc lệch khá thoải mái nên nói chung nó đều thay thế nhau được bạn có thể thử chuyển qua lại dễ dàng mà. Bạn dùng sơ đồ khối để dễ hình dung.
không được bạn ơi, mà bạn dùng vào gì mà phải chạy ngược chuỗi?
bạn cũng có thể viết một hàm tương tự như strtok nhưng chạy ngược chuỗi được mà
sửa câu if thành if((s[i]==’ ')) xóa bỏ s[i+1] là xong
char s[100]="MOT HAI BA NAM";
int i,n,j,dem,lap=0;
printf("Chuoi truoc khi cat:\n");
for(i=0;i<n;i++)
{
printf("%c",s[i]);
}
//gets(s);
dem=0;
n=strlen(s);
//do
//{
for(i=0;i<n;i++)
{
if((s[i]==' '))
{
//dem++;
for(j=i;j<n;j++)
{
s[j]=s[j+1];
}
n--; //so ki tu cua chuoi giam xuong
i--; //sau buoc nay thi i se tang (vong for) nen ta se giam no xuong
}
}
lap++;
//}
//while(dem==0);
printf("Chuoi sau khi cat:\n");
//for(i=0;i<(n-dem);i++)
for (i=0;i<n;i++)
{
printf("%c",s[i]);
}
for(i=0; i<size; i++){
if(isblank(a[i]) == true && isblank(a[i+1]) == true){
for(j=i; j<size; j++){
a[j] = a[j+1];
}
size--;
i--;
}
}
bạn ơi cho mình hỏi , sao phải chuyển sang biến j để xóa khoảng trắng z?
Ban hoc den thuat toan xoa 1 phan tu trong mang se hieu
memmove
không cho chồng lấn nhé.