【问题标题】:Read a text file and uppercase first letter of every word in C读取文本文件和 C 中每个单词的大写首字母
【发布时间】:2016-12-27 22:10:32
【问题描述】:

我想读取现有文件并将每个单词的第一个字母大写。所以我想我可以从它们之间的空格中找出单词,但我不知道如何专注于第一个字母,所以我只是全部大写,这是我到目前为止的代码。

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

【问题讨论】:

  • 为什么会有getch();这一行?
  • 只是看程序流程慢,没有别的
  • 有调试器会更好

标签: c text file-handling


【解决方案1】:

...如何关注第一个字母...(?)

通过保存前一个字符来检测每个单词的第一个字母。让一个单词与 1) &lt;white-space&gt;&lt;Letter&gt; 的任何序列或 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;
}

【讨论】:

    【解决方案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);
    }
    

    【讨论】:

      【解决方案3】:

      假设您真的想在读取每个空间后等待(假设您的 getch() 的原因),那么您可以尝试在 do 循环之前设置 i = 0 。然后 if( i == 0 ) 然后 chr = toupper(chr) 并增加 i。最后,在 if( chr == ' ') 中再次包含 i = 0。

      另外,如果您想考虑其他空格字符(换行符、制表符等),那么您应该使用include &lt;ctype.h&gt; 并使用类似if( isspace(chr) ) 的isspace() 函数而不是if( chr == ' ' )

      【讨论】:

        猜你喜欢
        • 2014-03-26
        • 2020-08-30
        • 2021-12-04
        • 2015-04-19
        • 1970-01-01
        • 2016-12-05
        • 2015-11-10
        • 2017-08-02
        • 2013-12-15
        相关资源
        最近更新 更多