题目
从键盘输入一个字符文件名,以及一个英文字符串,将该文件中的该英文字符串中的小写英文字母变成大写。
示例:字符文件内容如下:
We are students. All the students study very hard.
So, these students are outstanding students.
输入的字符串为students
则程序运行结束后,文件内容变为:
We are STUDENTS. All the STUDENTS study very hard.
So, these STUDENTS are outstanding STUDENTS.
实验报告中要求描述关键算法或(代码实现方案)以及关键存储结构。
//源码放在最后,先贴一个出错位置的
//读取文件并查找替换匹配的字符
do {
if (match(fp, str)){
fprintf(fp, "%s", str);
continue; //已经移位了
}
fgetc(fp); //让光标移位到下一个
} while (!feof(fp));
我的疑惑
在我的理解里,首先这是r+
模式可以在任意位置读写,那么调用函数进行写入的时候,它不应该是在光标后面写入然后覆盖吗,就像键盘的insert
键一样。所以我的结果应该是正确的,可是为什么结果是下面这样的?
为什么会多一个s?为什么very和outstanding会少字符?我不理解了。难道fprintf不是我想的那样吗?
源码
#include <stdio.h>
int match(FILE *fp, char *str);
int main(){
//获取输入
char path[81]={0}, str[32]={0};
int check;
printf("请输入文件名:");
check = scanf_s("%s", path, 81);
if (check==0){
printf("输入的文件名过长!\n");
return 1;
}
printf("请输入英文字符串:");
check = scanf_s("%s", str, 32);
if (check==0){
printf("输入的英文字符串过长!\n");
return 1;
}
//统一将字符串str大写化
char *c = str;
while (*c != '\0')
{
if (*c>='a' && *c<='z')
*c -= 32;
c++;
}
//打开文件
FILE *fp;
if ((fp=fopen(path, "r+")) == NULL){
printf("打开文件失败!\n");
return 1;
}
//读取文件并查找替换匹配的字符
do {
if (match(fp, str)){
fprintf(fp, "%s", str);
continue; //已经移位了
}
fgetc(fp); //让光标移位到下一个
} while (!feof(fp));
fclose(fp);
return 0;
}
int match(FILE *fp, char *str){
int current = ftell(fp);
char *q=str, p=fgetc(fp);
int ret = -1; //默认-1用于判断是否被修改
while (*q!='\0' && p!=EOF)
{
p = p>='a'&&p<='z' ? p-32 : p;
if (*q != p) ret = 0; //在str或fp没结束就不匹配了
q++;
p = fgetc(fp);
}
if (*q=='\0' && ret==-1) ret = 1; //str结束前都是匹配的,所以匹配
else ret = 0; //否则是前面已判断或fp结束,不全匹配
//光标归位
fseek(fp, current, SEEK_SET);
return ret;
}
:文件时d.txt,输入的字符串是students
标签:fp,students,C语言,fprinf,关于,str,字符串,check,输入 From: https://www.cnblogs.com/faf4r/p/17001925.html