关于字符串交换,大一新生基础题,没学会

每行的第一个单词的最后一个字母和最后一个单词的第一个字母交换。而且要用到调用文件。
输入in.txt
Hello, world!
The dark side of the Moon
mother dauther
输出out.txt
Hellow ,orld!
ThM dark side of the eoon
mothed rauther
谁能给讲一下该怎么做😭
大一开学刚两个月让我做这题,不过就不给考试资格,裂开了

逐行读取文件,对每行字符做如下处理:
遍历每个字符,找到第一个字符是字母的地方,做个标记1,继续找到第一个非字母字符,记录位置为p,如果标记是1,那么记录p-1位置出的字符,该字符即为第一个单词的最后一个字母。在第一个非字母字符标记位置开始,记录非字母字符后的第一个字符q(单词的首字母),一直到字符串结尾,这样,q随着字符串遍历一直更新,直到字符串遍历结束。然后交换p-1位置处的字符和q,然后写入文件就可以了。
运行结果:

img

代码:

#include <stdio.h>

//判断是否是字母
int isZm(char c)
{
    if((c >='a' && c <='z') || (c >='A' && c <='Z'))
        return 1;
    else
        return 0;
}



int main()
{
    FILE* fpin,*fpout;
    char buf[100],tmp;
    int i,flag,start,end;
    fpin = fopen("in.txt","r");
    fpout = fopen("out.txt","w");
    if (fpin == 0)
    {
        printf("文件打开失败\n");
        return 0;
    }
    while(!feof(fpin))
    {
        fgets(buf,100,fpin);
        flag = 0;
        start = 0;end = 0;
        for (i=0;buf[i] != 0;i++)
        {
            if( isZm(buf[i]) )
            {
                if (flag ==0)
                {
                    flag = 1;
                }
                if(i>0 && (!isZm(buf[i-1])) )
                    end = i;
            }else
            {
                if(flag == 1)
                {
                    start = i-1;
                    flag = 2;
                }
            }
        }
        tmp = buf[start];
        buf[start] = buf[end];
        buf[end] = tmp;
        //写入文件
        fprintf(fpout,"%s",buf);
    }
    fclose(fpin);
    fclose(fpout);
    return 0;
}