C语言必会100题(20)。计算字符串中子串出现的次数/从键盘输入字符,送到磁盘/输入小写磁盘保存大写/合并文件/五个学生,3门课程,保存到文件中

特此鸣谢:鱼C_小甲鱼(B站up主)不二如是(鱼C论坛大佬)
题目来源:https://fishc.com.cn
注:这些题在网上都可以搜到,题下面的代码大多是流传下来的答案(我重新排了一下版,增加了可读性),部分是本人经过深思熟虑后编写的。

96,计算字符串中子串出现的次数

  • 题目:输入两个字符串,判断第二个字符串在第一个字符串中出现的次数
  • 程序源代码:
    #include <string.h>
    #include <stdio.h>
    
    int main(void) 
    {
        char str1[20], str2[20], *p1, *p2;
        int sum = 0;
    
        printf("please input two strings\n");
        scanf("%s%s", str1, str2);
    
        p1 = str1;
        p2 = str2;
    
        while(*p1 != '\0') {
    
            if(*p1 == *p2) {
    
                while(*p1 == *p2 && *p2 != '\0') {
    
                    p1++;
                    p2++;
                }
            } else {
    
                p1++;
            }
    
            if(*p2 == '\0') {
    
                sum++;
            }
            p2 = str2;
        }
    
        printf("%d", sum);
        getchar();
        
        return 0;
    }

97,从键盘输入字符,送到磁盘

  • 题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。
  • 程序源代码:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        // 文件指针
        FILE *fp;
        char ch, filename[10];
        printf("请输入想要创建的文件名称,加后缀:");
        scanf("%s", filename);
    
        // 创建只写文件失败的话
        if((fp = fopen(filename, "w")) == NULL) {
    
            printf("cannot open file\n");
            // 正常退出,必须有头文件,#include <stdlib.h>
            exit(1);
        }
    
        ch = getchar();
    
        printf("输入文件内容:");
        while(ch != '#') {
    
            // 将字符ch写到文件指针fp所指向的文件的当前写指针的位置
            fputc(ch, fp);
            // 打印输出
            putchar(ch);
            // 判读是否为#
            ch = getchar();
        }
        // 关闭文件
        fclose(fp);
    
        return 0;
    }

98,输入小写磁盘保存大写

  • 题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符串以!结束。
  • 程序源代码:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() 
    {
    
        FILE *fp;
        char str[100];
        int i = 0;
    
        if((fp = fopen("test ", "w")) == NULL) {
    
            printf("cannot open the file\n");
            exit(0);
        }
        printf("please input a string:\n");
    
        // gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符数组 str 的内存空间
        gets(str);
    
        while(str[i] != '!') {
    
            if(str[i] >= 'a' && str[i] <= 'z') {
    
                str[i] = str[i] - 32;
            }
    
            // 将字符str[i]写到文件指针fp所指向的文件的当前写指针的位置
            fputc(str[i], fp);
            i++;
        }
    
        fclose(fp);
    
        // 从test.txt文件中读取字符到str数组里面
        fp = fopen("test ", "r");
        fgets(str, strlen(str) + 1, fp);
    
        printf("%s\n", str);
        fclose(fp);
    
        return 0;
    }

99,合并文件

  • 题目:创建两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),存放到一个新文件C中并输出。
  • 程序源代码:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main() 
    {
    
        FILE *fp;
        int i, j, n, ni;
        char c[160], t, ch;
    
        // 创建A文件,输入字母
        // w 新建一个文本文件,已存在的文件将内容清空,只允许写
        // 创建失败的话
        if((fp = fopen("A", "w")) == NULL) {
    
            printf("file A cannot be opened\n");
            exit(0);
        }
    
        // 用户输入A文件内容
        printf("输入A文件内容:");
        while( (ch = getchar()) != '\n') {
    
            fputc(ch, fp);
        }
        fclose(fp);
    
        // 打印输出A文件内容
        printf("A contents are :\n");
        // r 打开一个文本文件,文件必须存在,只允许读
        fp = fopen("A", "r");
        // 文件内容放到c数组里面
        for(i = 0; (ch = fgetc(fp)) != EOF; i++) {
    
            c[i] = ch;
            putchar(c[i]);
        }
        fclose(fp);
        ni = i;
        printf("\n\n");
    
    
        // 创建B文件,输入字母
        // w 新建一个文本文件,已存在的文件将内容清空,只允许写
        // 创建失败的话
        if((fp = fopen("B", "w")) == NULL) {
    
            printf("file B cannot be opened\n");
            exit(0);
        }
    
        // 用户输入A文件内容
        printf("输入B文件内容:");
        while( (ch = getchar()) != '\n') {
    
            fputc(ch, fp);
        }
        fclose(fp);
    
        // 打印输出B文件内容
        printf("B contents are :\n");
        // r 打开一个文本文件,文件必须存在,只允许读
        fp = fopen("B", "r");
        // 文件内容放到c数组里面
        for(i = ni; (ch = fgetc(fp)) != EOF; i++) {
    
            c[i] = ch;
            putchar(c[i]);
        }
        fclose(fp);
        n = i;
        printf("\n\n");
    
        // 将c数组里面的两个文件的内容进行排序
        for(i = 0; i < n; i++) {
    
            for(j = i + 1; j < n; j++) {
    
                if(c[i] > c[j]) {
                    t = c[i];
                    c[i] = c[j];
                    c[j] = t;
                }
            }
        }
    
        // 创建c文件,并且将排序好的字母放到c文件里面
        printf("C file is:\n");
        fp = fopen("C", "w");
        for(i = 0; i < n; i++) {
    
            putc(c[i], fp);
            putchar(c[i]);
        }
        fclose(fp);
    
        return 0;
    }

100,五个学生,3门课程,保存到文件中

  • 题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,最后把原有的数据和计算出的平均分数存放在磁盘文件"stud"中。
  • 程序源代码:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct student {
    
        char num[6];
        char name[8];
        int score[3];
        float avr;
    } stu[5];
    
    int main()
    {
        int i, j;
        float sum = 0;
        FILE *fp;
    
        for(i = 0; i < 5; i++) {
    
            printf("please input No.%d score:\n", i + 1);
            printf("stuNo:");
            scanf("%s", stu[i].num);
            printf("name:");
            scanf("%s", stu[i].name);
    
            for(j = 0; j < 3; j++) {
    
                printf("score %d.", j + 1);
                scanf("%d", &stu[i].score[j]);
                sum += stu[i].score[j];
            }
            stu[i].avr = sum / 3.0;
        }
    
        fp = fopen("stud.txt", "w");
        for(i = 0; i < 5; i++) {
    
            if(fwrite(&stu[i], sizeof(struct student), 1, fp) != 1) {
    
                printf("file write error\n");
            }
        }
    
        fclose(fp);
    
        return 0;
    
    }
posted @ 2022-03-20 22:02  炸天帮帮主  阅读(277)  评论(0编辑  收藏  举报