天天看点

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;
}

           

继续阅读