0

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

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

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

4

2 回答 2

1

从 cplusplus.com 的toupper()页面:

int toupper ( int c );

将小写字母转换为大写 如果 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 remark:如果您的文档包含类似的单词,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;
}
于 2013-04-01T16:12:11.830 回答
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
于 2013-04-01T16:28:17.677 回答