【问题标题】:capitalize first letter in file大写文件中的第一个字母
【发布时间】:2014-12-23 19:57:57
【问题描述】:

我正在尝试将第一个字母大写。字符是从文本文件中读取的。不幸的是,我不能。我读到一个想法,它说添加两个布尔变量,这可能是 int 类型:当当前字符是单词的一部分时,一个变量将保持 1,当前一个字符是单词的一部分时,另一个变量将保持 1。但是,我怎么知道 char 是否是 word 的一部分?

#include <stdio.h>

void cpt(char x[]);

int main(){

    cptlz("in.txt");

    return 0;
}
void cptlz(char x[]){

    char ch;

    int currentch,
        previouschar,
        st=1;

    FILE *fptr_in;

    if((fptr_in=fopen(x,"r"))==NULL){
        printf("Error reading file\n");
    }
    else{
        while(st==1){
            st=fscanf(fptr_in,"%c",&ch);
        if (ch >= 'a' && ch <= 'z'){
            printf("%c",ch-32);
        }
            else
                printf("%c",ch);
            }
        }
}

【问题讨论】:

  • 我建议你阅读fgetsisspacetoupper
  • 一种简单的方法是检查前一个字符是否为空格、换行符、特殊字符......而当前字符是否为字母......这意味着你在一个单词的开头(注意,“... a word” woukd 会导致“... A Word”)
  • 想想吧。首先弄清楚哪些字符在单词中可以找到,哪些不是。
  • 你的函数应该做什么?你有不同的名字,它的参数x 似乎没有被使用,...请在提问之前整理好你的问题你的代码。投票结束。
  • 另请注意,fscanf(和家人)使用"%s" 格式读取空格 分隔的“单词”。

标签: c file-io letters


【解决方案1】:

试试这段代码..

void cptlz(char x[]){

char ch;

int currentch,
    previouschar='\n',
    st=1;

FILE *fptr_in;

if((fptr_in=fopen(x,"r"))==NULL){
    printf("Error reading file\n");
}
else{

    while((ch=fgetc(fptr_in))!=EOF){

    if (ch >= 'a' && ch <= 'z' && (previouschar=='\n' || previouschar==' ')){
        printf("%c",ch-32);
    }
        else
            printf("%c",ch);

    previouschar=ch;
        }

    }
}

【讨论】:

  • 这不会“将每个单词的第一个字母大写”,而是每个的第一个字母。
  • OP没有提到“words”的具体格式,所以以下可能是不必要的改进;但是您的代码不会将括号之间单词的第一个字符大写。 (考虑另一种检查方法,而不是将( 添加到您的列表中。不用担心,您的方法是正确的。)
  • 此代码用于为提出问题的人提供一个想法。我明白你的意思..谢谢..
【解决方案2】:

字符是“单词的一部分”,如果满足以下条件,则应大写:

  1. 它是一个小写字符a..z(对于它,您可以并且可能应该使用标准库函数islower),并且
  2. 前一个字符不是字母——大写或小写(可以通过标准库函数isalpha进行测试)。

所以你要记住“最后的状态”(遇到any字母);当当前字符是另一个字母最后一个不是,你必须把它大写。 (原则上你也可以在这里使用isalpha,但是你只需要检查它是否是一个小写字母,因为如果它已经是一个大写,你不必改变它。)

输出字符后(无论是否更改),将其保存为lastWasLetter 的新状态。我把原来的previouschar改了名字和功能,因为你真的不需要测试实际值——你只需要知道它是不是一个字母。

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

void cptlz (const char *x);

int main(){

    cptlz("in.txt");

    return 0;
}

void cptlz (const char *input_filename)
{
    int ch, lastWasLetter = 0;

    FILE *fptr_in;

    fptr_in = fopen (input_filename,"r");
    if(fptr_in == NULL)
    {
        printf ("Error reading file '%s'\n", input_filename);
        return;
    }
    while ( (ch = fgetc (fptr_in)) != EOF )
    {
        if (!lastWasLetter && islower(ch))
            ch = toupper(ch);
        printf ("%c",ch);
        lastWasLetter = isalpha(ch);
    }
    fclose (fptr_in);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-08
    • 2014-01-02
    • 1970-01-01
    • 2013-09-01
    • 2011-09-29
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    相关资源
    最近更新 更多