从一个文件中读取一篇英文文章,请将文章中所有单词首字母大写并存入另一个文件中。“单词”是指一串连续的字母。
函数接口定义:
void CapitalizeTheFirstLetter(FILE *in, FILE *out);
说明:参数 in 和 out 为指示两个文件的指针。函数从 in 所指文件中的读出数据,将结果写入 out 所指的文件中。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
void CapitalizeTheFirstLetter(FILE *in, FILE *out);
int main()
{
FILE *in, *out;
in = fopen("in.txt", "r");
out = fopen("out.txt", "w");
if (in && out)
{
CapitalizeTheFirstLetter(in, out);
}
else
{
puts("文件无法打开!");
}
if (in)
{
fclose(in);
}
if (out)
{
fclose(out);
puts("文件保存成功!");
}
return 0;
}
输入样例:
Spring Morning
translated by Xu Yuanchong
This spring morning in bed I am lying,
not awake till birds are crying.
After one night of wind and showers,
how many are the fallen flowers.
输出样例:
程序运行结束后,打开“out.txt”文件,查看文件内容。
Spring Morning
Translated By Xu Yuanchong
This Spring Morning In Bed I Am Lying,
Not Awake Till Birds Are Crying.
After One Night Of Wind And Showers,
How Many Are The Fallen Flowers.
思路:
题目要求将一个文件中的英文文章单词首字母大写并存入一个新的文件中,首先就是想如何判断这个字符是不是一个单词的首字母,若是,就将这个字母变为大写,存入新文件;若不是,就直接存入新文件。 其次,如何判断这个字符是不是一个单词的首字母,我们可以设置一个整型变量num=1,如果不是字母,表示下一个是新单词,并在读取到这个单词的首字母的同时令num=0,这样下次读取到字母就可以根据这个变量来判断这个字母是不是首字母,当然,也可以用bool类型进行判断。 最后,将字母由大写变为小写或者由小写变为大写的时候可以用一般的+或者-32,也可以调用函数进行变换,要注意引头文件。依然不太懂的可以结合下面的代码和注释进行理解哈。
还有一个小问题,关于在创建ch这个变量是用int还是char?可以百度一下。
代码:
void CapitalizeTheFirstLetter(FILE *in, FILE *out)
{
char ch;//用于储存每次从文件中读取的字符
int num = 1; // 1表示是否是一个新单词的开头
// 逐字符读取文件
while ((ch = fgetc(in)) != EOF) //文件结束时循环终止
{
if (isalpha(ch)) //检查当前字符是不是字母
//当然也可以用 if((ch<='z'&&ch>='a')||(ch<='Z'&&>='A'))这个来进行判断
{
// 如果是字母,进行下面的内容
if (num)// 如果是新单词的开头,将首字母大写
{
ch = toupper(ch);//将首字母转换为大写,和下面的tolower()对应
//也可以不用函数,用一般的方法对字母进行大小写转换
num = 0; // 令num=0,即该字符不是新单词的开头
}
else
{
// 如果不是新单词的开头,将字母转换为小写
ch = tolower(ch);
}
}
else//如果不是字母,进行下面的内容
{
num = 1;//表示一个新单词的开始
}
fputc(ch, out);// 写入目标文件
}
}