C Primer Plus 第十三章 第七题

该程序实现了一个功能,能够读取两个文件并仅打印包含可打印字符的行,同时保持原有格式。通过检查每行的字符,如果发现有非空白字符,则打印该行,直至文件结束。程序使用了ctype.h库中的isspace函数来判断字符是否为空格。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有许多的答案仅仅是普通的逐行打印,如果遇到有空行也不能识别,我的程序可以做到只打印有可打印字符的行,并且保留这些行的格式(花哨的输入和打开关闭文件检查从略)。

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

int printline(FILE *);//声明一个打印文件中有可打印内容的一行的函数,如果打印到文件末尾则返回0,否则返回1

int main(void)
{
   int file1_stat=1,file2_stat=1;
   int n=0;
   char file1[40];
   char file2[40];
   scanf("%s %s",file1,file2);
   FILE *fp1,*fp2; 
   fp1=fopen(file1,"r");
   fp2=fopen(file2,"r");
   do
   {
     if (file1_stat) //检查文件1状态,如果已到末尾则不再调用函数
        { 
          file1_stat=printline(fp1);
          putchar('\n');
        }
     if (file2_stat) //同上,检查文件2状态
        {
          file2_stat=printline(fp2);
          putchar('\n');
        }
   }while(file1_stat || file2_stat);//如果两文件都到末尾则循环结束
   fclose(fp1);
   fclose(fp2);
   return 0;
}

int printline(FILE *fp)
{
  int stat=0,n=1;
  int ch;
  while(!stat)//如果遇到有可打印字符(stat==1)则终止循环,开始打印
  {
     while ((ch=getc(fp))!='\n'  && ch!=EOF)//检查一行中有否可打印字符
     {
       if (!isspace(ch))//如果有可打印字符
       { 
         fseek(fp,-n,SEEK_CUR);//则将光标退到行首,n为行字符计数器
         stat=1;//标明有可打印字符
         break;//只要遇到有一个可打印字符就退出检查
       }
       n++;//如果这个字符不是可打印字符则继续,计数器+1
     }
     n=1;//本行检查结束,计数器复原
     if (ch==EOF)  return 0;//如果直到末尾都没有可打印字符则返回0
  }
  while ((ch=getc(fp))!='\n'  && ch!=EOF) putchar(ch);//退出前一个循环表示有字符需要打印,打印该行
  if (ch==EOF) return 0;//检查打印的是否最后一行
  return 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值