丝雨学姐小灶班——Week 6

  1. NOJ 61# 源程序添加行号

卡了足足一个星期才开始做文件这一季的题目,真的是心累
直接上新学到的函数:

FILE * fopen(const char * path,const char * mode)
//int feof (FILE *stream)   (用 while (fgets(s1,sizeof(s1)-1,fp) != NULL) 合并完成)
char *fgets(char * s, int n,FILE *stream);
int sprintf(char *buffer, const char *format, [argument]...)
int fputs(const char *str, FILE *stream)

附上完整代码:

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

int main()
{
    FILE *fp,*out;
    int i=1;
    char s1[100],s2[100];
    fp=fopen("DATA5612.CPP","r");
    if (fp != NULL) {
        out=fopen("DATA5612.TXT","w");
        while (fgets(s1,sizeof(s1)-1,fp) != NULL) {
            sprintf(s2,"%04d %s",i++,s1);
            fputs(s2,out);
        }
    }
    fclose(fp);
    fclose(out);

    return 0;
}

fscanf位于头文件<stdio.h>中,函数原型为int fscanf(FILEstream, constcharformat, [argument…]); 其功能为根据数据格式(format)从输入流(stream)中写入数据(argument);与fgets的差别在于:fscanf遇到空格和换行时结束,注意空格时也结束,fgets遇到空格不结束。

  1. NOJ 62# 检测位图长宽
#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp=fopen("DATA5611.BMP","rb");
    long biWidth,biHeight;
    if(fp!=NULL)
	{
		fseek(fp,18,SEEK_SET);
		fread(&biWidth,sizeof(long),1,fp);
		fread(&biHeight,sizeof(long),1,fp);
		printf("%ld %ld",biWidth,biHeight);
		fclose(fp);
	}
	return 0;
}
  1. NOJ 69# 单词频次
if (!strcmp(s,"if")) cnt1++;	//若字符串数组s==“if”则计数器++
if (!strncmp(s+6,"JFIF",strlen("JFIF")))  cnt1++;	//若从字符串数组s的第7个单元开始的长度为字符串“JFIF”的长度的字符串==“JFIF”则计数器++

由于两个函数比对成功均返回0,故注意取非!!!

char s[20]="";
        while (fscanf(fp,"%s",s) != EOF) {
            if (!strcmp(s,"if")) cnt1++;
            if (!strcmp(s,"while")) cnt2++;
            if (!strcmp(s,"for")) cnt3++;
        }

开动脑筋思考一下,为什么忘了取非,最后结果会是“2 2 2”呢~

……
好吧扯了这么多结果PE了 /笑哭
经过胡大佬的指点,我发现我对题目的考虑不够周全。如果输入中出现

xxx if(%^# xxx

这样的情况,算不算出现了单词 if 呢?题目需要我把这样的前面或者后面没有空格的单词也算进去呀!(虽然我觉得题目的表述有点坑——出现"if",“while”,“for”【单词】的个数???)
OK,那正确方法应该是 j, j+1, j+2 这样的,完整代码如下:

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

int main()
{
    FILE *fp=fopen("DATA5610.TXT","r");
    int i=0,j=0,cnt1=0,cnt2=0,cnt3=0;
    char s[1000][1000];
    if (fp != NULL) {
        while (fgets(s[i],999,fp) != NULL) {
            for (j=0; j<1000; j++) {
                if (s[i][j]=='i' && s[i][j+1]=='f') cnt1++;
                if (s[i][j]=='w' && s[i][j+1]=='h' && s[i][j+2]=='i' && s[i][j+3]=='l' && s[i][j+4]=='e') cnt2++;
                if (s[i][j]=='f' && s[i][j+1]=='o' && s[i][j+2]=='r') cnt3++;
            }
            i++;
        }
    }
    fclose(fp);
    printf("%d %d %d",cnt1,cnt2,cnt3);
    
    return 0;
}
  1. NOJ 69# 单词频次
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值