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; }