我正在尝试从文件中选择某些字符,将它们大写并显示输出。我在选择字符时遇到了一些麻烦:
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);
是的,这是一项家庭作业。我不是在寻找答案,我只是想了解我做错了什么。它不需要使用字符串或数组。程序应该读取文件的内容,大写每个单词的第一个字母,然后打印结果。
答案 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