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;
...}
不知道你这个问题是否已经解决, 如果还没有解决的话:如何用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)