6-2 *删除行末空白字符

PTA练习 C语言 删除行末空白字符
有问必答
c语言
有少数初学者编程时,没有留意行末多余的空白字符,这不是好的编程习惯。现在请你编写一个函数,把初学者源程序文件中每行末尾多余的空白字符全都删去。

函数原型


// 删除行末空白字符
void Cut(FILE *src, FILE *dst);

说明:参数 src 和 dst 均为文件指针,其中:src 指示初学者的源程序文件,dst 指示整理后的源程序文件。

注:

源程序中所能输入的空白字符仅限于空格符 ' ' (<SP>) 和 制表符 '\t' (<HT>)。
最后一行末尾可能没有换行符。
每一行的长度不限。
在 Unix 或 Linux 系统下,源程序文件每行末尾为一个换行符 '\n' (<LF>),而在 Dos 或 Windows 系统下,源程序文件每行末尾为一个回车符 '\r' (<CR>) 和一个换行符 '\n' (<LF>)。

裁判程序

#include <stdio.h>
#include <ctype.h>
#include <string.h>
 
// 删除行末空白字符
void Cut(FILE *src, FILE *dst);
 
int main()
{
    char sname[1024], dname[1024];
    FILE *sfile, *dfile;
 
    gets(sname);
    gets(dname);
 
    sfile = fopen(sname, "rb");
    if (!sfile)
    {
        printf("%s 无法打开!\n", sfile);
    }
    dfile = fopen(dname, "wb");
    if (!dfile)
    {
        printf("%s 无法打开!\n", dfile);
    }
 
    if (sfile && dfile)
    {
        printf("正在整理...");
        Cut(sfile, dfile);
        puts("整理完成!");
    }
 
    if (sfile)
    {
        fclose(sfile);
    }
    if (dfile)
    {
        fclose(dfile);
    }
    return 0;
}
 
/* 你提交的代码将被嵌在这里 */

输入样例

old.c
new.c

old.c

...#include...<stdio.h>...
...
...int...main()...
...{...
.......printf("Hello,...world!\n");...
.......return...0;...
...}...

输出样例

正在整理...整理完成!

new.c

...#include...<stdio.h>

...int...main()
...{
.......printf("Hello,...world!\n");
.......return...0;
...}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    问题

    如何用C语言编写一个函数来删除每行末尾的空白字符?函数原型是什么?其中参数src和dst都是文件指针,src指向一个初学者的源程序文件,dst指向整理后的源程序文件。源程序中可以输入的空白字符只包括空格符和制表符,最后一行末尾可能没有换行符,每行长度不限。在Unix或Linux系统中,每行末尾是一个换行符,而在DOS或Windows系统中,每行末尾是一个回车符和一个换行符。请在优化后的问题中添加prompt来更好地理解问题。

    回答

    函数原型:

    int trim(char *src, char *dst);
    

    其中,src是指向文件输入流的指针,dst是指向文件输出流的指针。

    具体实现步骤如下:

    1.打开源代码文件和目标代码文件,在源代码文件中读取一行的字符,存入一个缓冲区中;

    char *buffer = malloc(BUFFERSIZE * sizeof(char));
    while(fgets(buffer, BUFFERSIZE, src) != NULL)
    {
        //删除行末空白字符
    }
    

    2.对该行字符进行处理。从缓冲区的最后一个字符往前遍历,如果该字符为空格或制表符,就将其删除,否则停止遍历;

    int len = strlen(buffer);
    for(int i=len-1; i>=0; i--)
    {
        if(buffer[i] == ' ' || buffer[i] == '\t')
        {
            buffer[i] = '\0';
        }
        else
        {
            break;
        }
    }
    

    3.将处理后的字符串写入目标代码文件中;

    fputs(buffer, dst);
    

    4.关闭源文件和目标文件。

    fclose(src);
    fclose(dst);
    

    完整代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define BUFFERSIZE 1024
    
    int trim(char *src,char *dst)
    {
        char *buffer = malloc(BUFFERSIZE * sizeof(char));  //定义字符缓冲区
        if(buffer == NULL)
        {
            printf("Error: failed to allocate memory.\n");  //内存分配失败
            return -1;
        }
    
        while(fgets(buffer, BUFFERSIZE, src) != NULL)  //从源代码文件中读取一行字符
        {
            int len = strlen(buffer);  //获取该行字符的长度
            for(int i=len-1; i>=0; i--)  //从缓冲区的末尾开始遍历
            {
                if(buffer[i] == ' ' || buffer[i] == '\t')  //如果为制表符或空格
                {
                    buffer[i] = '\0';  //用'\0'代替
                }
                else
                {
                    break;       //当不为制表符或空格时,停止循环
                }
            }
    
            fputs(buffer, dst);  //将该行字符写入目标代码文件
        }
    
        free(buffer);  //释放缓冲区内存
        return 0;
    }
    
    int main(int argc, char *argv[])
    {
        if(argc != 3)  //输入参数不足
        {
            printf("Error: illegal input parameters.\n");
            printf("Usage: ./trim source_filename dest_filename\n");
            return -1;
        }
    
        FILE *src, *dst;
    
        if((src = fopen(argv[1], "r")) == NULL)  //打开源代码文件失败
        {
            printf("Error: failed to open source file.\n");
            return -1;
        }
    
        if((dst = fopen(argv[2], "w")) == NULL)  //打开目标代码文件失败
        {
            printf("Error: failed to open destinate file.\n");
            fclose(src);
            return -1;
        }
    
        if(trim(src, dst) == -1)  //调用删除行末空白字符函数失败
        {
            fclose(src);
            fclose(dst);
            return -1;
        }
    
        fclose(src);
        fclose(dst);  //关闭文件
        return 0;
    }
    

    本回答参考了“李靖龙 & 编程3班”的[博客](https://blog.csdn.net/qq_38439519/article/details/100747153))以及“破船之家”的[论坛](https://bbs.pediy.com/thread-265818.htm)


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^