大写从文件中读取的字母

时间:2013-04-01 16:01:38

标签: c

我正在尝试从文件中选择某些字符,将它们大写并显示输出。我在选择字符时遇到了一些麻烦:

int i;
char c;
char currentChar;
char previousChar = ' ';

inp = fopen("junk.txt", "r");
if(inp == NULL){
    printf("Error opening file, quitting... \n");
    return 1;
}

c = fgetc(inp);
 while(c != EOF){
     if(isalpha(c)){
      putchar(toupper(c));
    c = fgetc(inp);

是的,这是一项家庭作业。我不是在寻找答案,我只是想了解我做错了什么。它不需要使用字符串或数组。程序应该读取文件的内容,大写每个单词的第一个字母,然后打印结果。

2 个答案:

答案 0 :(得分:1)

来自cplusplus.com的toupper()页:

  

int toupper(int c);

     

将小写字母转换为大写将c转换为大写   等效,如果c是小写字母并且具有大写等效字母。   如果无法进行此类转换,则返回的值将保持不变。

因此,不需要检查if(isalpha(c))以查找您想要大写的字符

您的代码可能如下所示

char previousChar = ' ';
while((c = fgetc(inp)) != EOF){
   if(!isalpha(previousChar))
       putchar(toupper(c));
   else
       putchar(c);
   previousChar = c;
}

根据alk评论:如果您的文档包含peer2peer之类的字词,那么它将显示Peer2Peer以及之前的代码。如果您想要显示Peer2peer,您必须以这种方式更改支票:

char previousChar = ' ';
while((c = fgetc(inp)) != EOF){
   if(previousChar==' ' || previousChar=='\n' || previousChar=='\r' ||
      previousChar=='\t' || previousChar=='\v')
       putchar(toupper(c));
   else
       putchar(c);
   previousChar = c;
}

答案 1 :(得分:0)

关于常用字分隔符的各种可能性,我建议采用这种方法:

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

int main(void)
{
  int result = EXIT_SUCCESS; /* be optimistic! :-) */

  int charCurrent = '\0'
  int charPrevious = ' ';

  while (EOF != (charCurrent = fgetc(stdin)) || (EOF == charPrevious))
  {
    if (isspace(charPrevious))
    {
      charCurrent = toupper(charCurrent);
    }

    charPrevious = fputc(charCurrent, stdout);
  }

  if ((EOF == charCurrent) && !feof(stdin))
  {
    result = EXIT_FAILURE;
    fprintf(stderr, "error getting\n");
  }

  if (EOF == charPrevious)
  {
    result = EXIT_FAILURE;
    fprintf(stderr, "error putting\n");
  }

  return result;
}

然后您调用该程序:

$ ./capitaliser <infile.txt >outfile.txt