30/09/2018, 17:35

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]='';
                fgets(s2,100,f1);
                tachtu(s1,n1,ds1);
                tachtu(s2,n2,ds2);
                loaitu();
        }                                      
}
Gió viết 19:40 ngày 30/09/2018

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

Linh Trần viết 19:49 ngày 30/09/2018

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.

Gió viết 19:36 ngày 30/09/2018
//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");
} 
Linh Trần viết 19:41 ngày 30/09/2018

Cám ơn b nhiều.

Linh Trần viết 19:50 ngày 30/09/2018

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

Bài liên quan
0