30/09/2018, 16:41

Viết chương trình cắt bỏ các khoảng trắng

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

void catbo(char s[])
{
    int n,i,j=0;
    char t[30];
    n=strlen(s);
    for(i=0;i<n;i++)
        if(s[i]!=' ')
        t[i-j]=s[i];
    else
        j++;
    t[n-j]='';
    strcpy(s,t);
}
void main()
{
    char s[30];
    printf("Nhap chuoi: ");
    gets(s);
    catbo(s);
    puts(s);
    getch();
}

[quote=“slaomoking, post:1, topic:5017”]

#include &lt;stdio.h&gt;
#include &lt;conio.h&gt;
#include &lt;string.h&gt;

void catbo(char s[])
{
    int n,i,j=0;
    char t[30];
    n=strlen(s);
    for(i=0;i<n;i++)
        if(s[i]!=' ')
        t[i-j]=s[i];
    else
        j++;
    t[n-j]='';
    strcpy(s,t);
}
void main()
{
    char s[30];
    printf("Nhap chuoi: ");
    gets(s);
    catbo(s);
    puts(s);
    getch();
}

Các bạn có thể giải thích cho mình từ vòng lặp for trở xuống là như thế nào không vậy?

Gió viết 18:41 ngày 30/09/2018

Biến j sẽ đếm các kí tự = ' ' từ 0 -> i. với ý nghĩa đó, khi s[i]' ' bỏ qua+ tăng j lên. Khi # ' ' thì gán s[i-j] cho s[i].
Tại sao lại gán cho vị trí s[i-j]: khi có j kí tự trắng thì sau khi xoá, s[i] phải dịch lên j đơn vị.
Dùng mảng t là không cần thiết
Code này nhanh và tiết kiệm bộ nhớ hơn:

void catbo( char * s){
     int i= 0, j= 0;
     while(s[i]){ 
          if(isspace(s[i])) j++;
          else s[i-j]=s[i];
          i++;
     }
     s[i-j]= 0;
}
Bài liên quan
0