Nhập hai xâu s1 và s2, tìm các từ xuất hiện trong s1 mà không xuất hiện trong s2?

Mọi ng xem hộ e code sai ở đâu vs ạ. E cám ơn nhiều. Chắc sai ở biến test nhưng e chưa biết sửa ntn. Vì nếu k dính dáng gì đến biến test (biến t) , chạy thử 1 ví dụ bất kỳ code chạy đúng.

LẦN ĐẦU POST BÀI CÓ GÌ SAI SÓT MONG MỌI NGƯỜI GÓP Ý Ạ.

Đề bài: Nhập hai xâu s1 và s2. Hãy viết chương trình tìm các từ xuất hiện trong s1 mà không xuất hiện trong s2. Sau đó xuất xâu s1. (Nhập, xuất ra màn hình bằng đuôi file .inp và .out)
Ví dụ:

INPUT:

2(2 bộ test)
aaa xyz ab abc dd dd abc aaa
xyz dd ttt sas cdc
aaa xyz ab abc dd dd abc aaa
aaa

OUTPUT:

aaa ab abc abc aaa
xyz ab abc dd dd abc

CODE: http://pastebin.com/tRZueEMD (Code hơi dài nên e để vào đg link cho dễ đọc ạ)

#include<stdio.h>
#include<string.h>
 
FILE *f1 = fopen("14c.inp","r");
FILE *f2 = fopen("14c.out","w");
 
struct tu
{
        char nd[20];
        int xh;
};
 
tu ds1[20],ds2[20];
 
int n1=0,n2=0;
void tachtu(char s[],int &n,tu ds[])
{
        char *p;
        p = strtok(s," ");
        while (p!=NULL)
        {
                strcpy(ds[n].nd,p);
                ds[n].xh=1;
                n++;
                p = strtok(NULL," ");
        }
}
 
void loaitu()
{
        int i,j;
        for (i=0;i<n1;i++)
                for (j=0;j<n2;j++)
                        if (strcmp(ds1[i].nd,ds2[j].nd)==0) {ds1[i].xh++; ds2[j].xh++;}
         
        for (i=0;i<n1;i++)
        if (ds1[i].xh==1) fprintf(f2,"%s ",ds1[i].nd);  
}
 
main()
{
        char s1[100],s2[100];
        int t;
        fscanf(f1,"%d",&t);
        while (t--)                                     //bien test
        {
                fgets(s1,100,f1);
                s1[strlen(s1)-1]='\0';
                fgets(s2,100,f1);
                tachtu(s1,n1,ds1);
                tachtu(s2,n2,ds2);
                loaitu();
        }                                      
}

Do bạn đọc xong chưa xuống dòng chỗ nhập t nên test 1 s1="", các test sau bị dồn lên. Đơn giản sửa lại câu nhập t: fscanf(f1,"%d\n",&t); đọc t xong xuống dòng

Bạn còn chưa reset n1=0 ;n2 =0 sau mỗi test

M đã sửa lại là:

fscanf(f1,"%d\n",&t);
//bien test
while (t--)
{
        fgets(s1,100,f1);
        s1[strlen(s1)-1]='\0';
        fgets(s2,100,f1);
        tachtu(s1,n1,ds1);
        tachtu(s2,n2,ds2);
        loaitu();
        fprintf(f2,"\n");
}

còn int n1=0,n2=0; có ở line 15 nhưng chạy vẫn chưa đúng b à. Hay phải để int n1=0,n2=0; ở chỗ khác? B xem giúp mình vấn đề ở đâu vậy? M cám ơn.

//bien test
while (t--)
{
        fgets(s1,100,f1);
        s1[strlen(s1)-1]='\0';
        fgets(s2,100,f1);
        n1=n2=0; //<- thêm vào chỗ này :D
        tachtu(s1,n1,ds1);
        tachtu(s2,n2,ds2);
        loaitu();
        fprintf(f2,"\n");
} 

Cám ơn b nhiều. :smile:

B xem giúp m biến test lại có vấn đề ở đâu mà lúc chạy bị lỗi xuống dòng b à.

Nhập 3 xâu ký tự ký tự s, s1, s2. Tìm tất cả những lần xuất hiện của s1 trong s và thay thế bằng s2. Xuất s ra màn hình.

INPUT

2
kldsv vksdvmdslvdsl vdsl svf
sv
12
jncsdk vsfgf vsd vzs
vs
123 56

OUTPUT

kld12 vksdvmdslvdsl vdsl 12f
jncsdk 123 56fgf 123 56d vzs

CODE: http://pastebin.com/u4b2y3N4

#include<stdio.h>
#include<conio.h>
#include<string.h>
FILE *f1 = fopen("thay.inp","r");
FILE *f2 = fopen("thay.out","w");
 
void thay(char s[],char s1[],char s2[])
{
        int i=0,j,k,t=0,m,n=strlen(s),n1=strlen(s1),n2=strlen(s2);
        char p[1000];
        while(s[i]!=NULL)
        {
                k=i;j=0;
                while(s[k]==s1[j])
                {
                        k++;j++;
                }
               
                if(j==n1)
                {
                        for(m=0;m<n2;m++)
                        {
                                p[t]=s2[m];
                                t++;
                        }
                        i=i+n1;
                }
               
                else
                {
                        p[t]=s[i];
                        t++;i++;
                }
        }
        p[t]='\0';
        fprintf(f2,"%s",p);
}
 
main()
{
        char s[100],s1[100],s2[100];
        int t;
        fscanf(f1,"%d\n",&t);
        while(t--)
        {
                fgets(s,1000000,f1);
                fgets(s1,1000000,f1);
                s1[strlen(s1)-1]='\0';
                fgets(s2,1000000,f1);
               
                thay(s,s1,s2);
        }
}

Cám ơn b nhé.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?