天天看點

BUAA字元串替換(新)

!記得不要抄!

【問題描述】

編寫程式将一個指定檔案中某一字元串替換為另一個字元串。要求:(1)被替換字元串若有多個,均要被替換;(2)指定的被替換字元串,大小寫無關。

【輸入形式】

給定檔案名為filein.txt。從控制台輸入兩行字元串(不含空格,行末尾都有回車換行符),分别表示被替換的字元串和替換字元串。

【輸出形式】

将替換後的結果輸出到檔案fileout.txt中。

【樣例輸入】

從控制台輸入兩行字元串:

in

out

檔案filein.txt的内容為:

#include <stdio.h>

void main()

{

FILE * IN;

if((IN=fopen(“in.txt”,“r”))==NULL)

{

printf(“Can’t open in.txt!”);

return;

}

fclose(IN);

}

【樣例輸出】

檔案fileout.txt的内容應為:

#outclude <stdio.h>

void maout()

{

FILE * out;

if((out=fopen(“out.txt”,“r”))==NULL)

{

prouttf(“Can’t open out.txt!”);

return;

}

fclose(out);

}

【樣例說明】

輸入的被替換字元串為in,替換字元串為out,即将檔案filein.txt中的所有in字元串(包括iN、In、IN字元串)全部替換為out字元串,并輸出儲存到檔案fileout.txt中。

方法一

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int main()
{
    FILE *fp, *pp;
    fp = fopen("filein.txt", "r");
    pp = fopen("fileout.txt", "w");

    char in[20], out[20], ch, str[1050];
    scanf("%s%s", &in, &out);

    int len_in, len_out, i = 0, len_str, j = 0;
    len_in = strlen(in);
    len_out = strlen(out);

    ch = fgetc(fp);
    while (ch != EOF)
    {
        str[i++] = ch;
        ch = fgetc(fp);
    }
    len_str = i + 1;

    for (i = 0; i < len_str; i++)
    {
        int flag = 0;
        if (tolower(str[i]) == tolower(in[0]))
        {
            for (j = 1; j < len_in; j++)
            {
                if (tolower(str[i + j]) != tolower(in[j]))
                {
                    flag = 1;
                }
            }

            if (flag == 0)
            {
                for (int z = 0; z < len_out; z++)
                {
                    fputc(out[z], pp);
                }
                i = i + len_in - 1; //後移單詞長度
            }

            else
            {
                fputc(str[i], pp);
            }
        }

        else
        {
            fputc(str[i], pp);
        }
    }

    fclose(fp);
    fclose(pp);
}
           

方法二

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

char a[105], b[105], c[10005];
int judge(int i, int d)
{
	int j, flag = 0;
	for (j = 0; j < d; j++)
	{
		if (tolower(c[i + j]) != tolower(a[j]))
			flag = 1;
	}
	if (flag == 1)
	{
		return 0;
	}
	else
		return 1;
}

int main()
{
	FILE *IN, *OUT;
	int l, d, e, i = 0, k;
	char flag;
	scanf("%s", a);
	scanf("%s", b);
	d = strlen(a);
	e = strlen(b);
	IN = fopen("filein.txt", "r");
	OUT = fopen("fileout.txt", "w");
	flag = fgetc(IN);
	while (flag != EOF)
	{
		c[i++] = flag;
		flag = fgetc(IN);
	}
	l = i + 1;
	for (i = 0; i < l; i++)
	{
		if (judge(i, d) == 1)
		{
			for (k = 0; k < e; k++)
			{
				fputc(b[k], OUT);
			}
			i += d - 1;
		}
		else
			fputc(c[i], OUT);
	}
	fclose(IN);
	fclose(OUT);
}

           

方法三

#include <stdio.h>
#include <string.h>
char search_case[1025], replace_case[1025];
char buff[1028];
char Tolower(char c)
{
    if (c >= 'A' && c <= 'Z')
        return 'a' - 'A' + c;
    return c;
}
void index(char s[], char t[], FILE *K, char g[])
{
    int i, j, k;
    for (i = 0; s[i] != '\0'; i++)
    {
        for (j = i, k = 0; t[k] != '\0' && Tolower(s[j]) == Tolower(t[k]); j++, k++)
            ;
        if (t[k] == '\0')
        {
            fputs(replace_case, K);
            i += strlen(search_case);
        }
        fputc(s[i], K);
    }
}
int main()
{
    fgets(search_case, 1025, stdin);
    fgets(replace_case, 1025, stdin);
    for (int i = 0;; i++)
    {
        if (search_case[i] == '\r' || search_case[i] == '\n')
        {
            search_case[i] = '\0';
            break;
        }
    }
    for (int i = 0;; i++)
    {
        if (replace_case[i] == '\r' || replace_case[i] == '\n')
        {
            replace_case[i] = '\0';
            break;
        }
    }
    FILE *input_document = fopen("filein.txt", "r");
    FILE *output_document = fopen("fileout.txt", "w");
    while (fgets(buff, 1026, input_document) != NULL)
    {
        index(buff, search_case, output_document, replace_case);
    }

    fclose(input_document);
    fclose(output_document);
    return 0;
}

           

繼續閱讀