读取文本文件和 C 中每个单词的大写首字母

Read a text file and uppercase first letter of every word in C

我想读取现有文件并将每个单词的第一个字母大写。所以我想我可以从它们之间的 space 中找出单词,但我不知道如何关注第一个字母所以我只把所有字母都变成大写,这是我目前的代码。

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

假设你真的想在每个 space 被读取后等待(假设你的 getch() 在那里的原因),那么你可以尝试在你的 do 循环之前设置 i = 0 。 Then if( i == 0 ) then chr = toupper(chr) and increment i.最后,在 if( chr == ' ') 中再次包含 i = 0 。

此外,如果您想考虑其他间距字符(换行符、制表符等),那么您应该 include <ctype.h> 并使用 isspace() 函数,例如 if( isspace(chr) ) 而不是 if( chr == ' ' ).

这应该可以解决问题

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

... how to focus on first letter ...(?)

通过保存前一个字符来检测每个单词的第一个字母。让一个词与 1) <white-space><Letter> 的任何序列或 2) 如果读取的第一个字符是字母。

其他问题:EOF检测太晚。在 fgetc()

之后立即检查 EOF
// 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;
}