特此鸣谢:鱼C_小甲鱼(B站up主)不二如是(鱼C论坛大佬)
题目来源:https://fishc.com.cn
注:这些题在网上都可以搜到,题下面的代码大多是流传下来的答案(我重新排了一下版,增加了可读性),部分是本人经过深思熟虑后编写的。
汇总:C语言
96,计算字符串中子串出现的次数
1.题目:输入两个字符串,判断第二个字符串在第一个字符串中出现的次数
2.程序源代码:
#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,从键盘输入字符,送到磁盘
1.题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。
2.程序源代码:
#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,输入小写磁盘保存大写
1.题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符串以!结束。
2.程序源代码:
#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,合并文件
1.题目:创建两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),存放到一个新文件C中并输出。
2.程序源代码:
#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门课程,保存到文件中
1.题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,最后把原有的数据和计算出的平均分数存放在磁盘文件"stud"中。
2.程序源代码:
#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;
}