我想读一个现有的文件并大写每个单词的第一个字母。所以我想我可以从它们之间的空间中弄清楚但是我不知道如何专注于第一个字母所以我只是全部大写,这是我的代码到目前为止。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
int main()
{
int chr,i;
FILE *fp;
fp = fopen("DATA.txt" , "r");
do
{
chr = fgetc(fp);
chr = toupper(chr);
printf("%c" , chr);
if (chr==' ')
{
getch();
}
} while(chr!=EOF);
fclose(fp);
}
答案 0 :(得分:3)
......如何专注于第一封信......(?)
通过保存前一个字符来检测每个单词的第一个字母。如果读取的第一个字符是一个字母,则让一个单词与1)<white-space><Letter>
或2)的任何序列。
其他麻烦:EOF
检测太晚了。在EOF
fgetc()
// EOF test too late
chr = fgetc(fp);
chr = toupper(chr);
printf("%c" , chr);
} while(chr!=EOF); // too late
// Instead
chr = fgetc(fp);
if (chr == EOF) break;
一起
int previous = ' ';
while ((chr = fgetc(fp)) != EOF) {
if (isspace(previous) && isalpha(chr)) {
chr = toupper(chr); // uppercase first letter of every word
}
printf("%c" , chr);
previous = chr;
}
答案 1 :(得分:2)
这应该可以解决问题
bool upperNext = true;
while((chr = fgetc(fp)) != EOF) {
if(chr == ' ' || chr == '\r' || chr == '\n') {
upperNext = true;
} else if(upperNext) {
chr = toupper(chr);
upperNext = false;
}
printf("%c" , chr);
}
答案 2 :(得分:1)
假设你真的想在读取每个空格后等待(假设你的getch()的原因),那么你可以尝试在你的循环之前设置i = 0。然后如果(i == 0)则chr = toupper(chr)并递增i。最后,在if(chr =='')中再次包括i = 0。
此外,如果您要考虑其他间距字符(换行符,制表符等),则应include <ctype.h>
并使用if( isspace(chr) )
之类的isspace()函数,而不是if( chr == ' ' )
。