【问题标题】:How can I do a C program that capitalizes the first characters of the words in the file?如何做一个将文件中单词的第一个字符大写的 C 程序?
【发布时间】:2018-05-24 12:10:57
【问题描述】:
    #include <stdio.h>

    int main()
    {
        FILE *fp;
        int i;
        int pos;

        fp=fopen("test.txt","r+");
        fseek(fp,0,SEEK_END);
        pos=ftell(fp);

        char ch[pos-1];
        fseek(fp,0,SEEK_SET);


        ch[0]=ch[0]-32;

        i=0;
        while(ch[i]=fgetc(fp)!=EOF){


            if(ch[i]!=' '){
                fseek(fp,1,SEEK_CUR);
                i++;
            }
            else{
                fseek(fp,1,SEEK_CUR);
                i++;
                ch[i]=fgetc(fp);
                ch[i]=ch[i]-32;
                fprintf(fp,"%c",ch[i]);
            }       
        }
        fclose(fp);








    }

我想制作一个将文件中单词的第一个字符大写的 C 程序。但是当我运行此代码时,.txt 文件出错了。 fgetc() 的用法是错误的吗? 这个问题我的错在哪里? fscanf 是在移动光标吗?

【问题讨论】:

  • ch[i]=ch[i]-32; 如果不是大写字母或非字母数字字符,将是完全错误的。使用if (isupper(ch[i]) ch[i]= tolower(ch[i]);
  • "r+" 模式(追加模式)打开将不允许您更改文件中的现有位置。使用"rw"
  • 如果您一次只使用一个字符,为什么还要使用这么大的缓冲区char ch[pos-1];?只需char ch; 就足够了。
  • 在while条件下你得到一个fgetc的字符,然后在fseek循环中你跳过一个字符然后你得到 另一个角色。这完全不同步,您已经消耗了 3 个字符,但您认为您已经处理了一个字符。
  • @PaulOgilvie if (isupper(ch[i]) ch[i]= tolower(ch[i]); 中的 if 语句是无关的。 ch[i] = tolower[ch[i]);tolower() 一样工作,只会修改大写的 char 值。每the C standard:“如果参数是isupper 为真的字符,并且有一个或多个对应字符,由当前语言环境指定,islower 为真,则 tolower 函数返回对应字符之一(总是对于任何给定的语言环境都相同);否则,参数将原样返回。"

标签: c file capitalization


【解决方案1】:

在你的while循环的条件下,你有

ch[i] = fgetc(fp) != EOF

由于 != 的优先级比 = 高,这相当于

ch[i] = (fgetc(fp) != EOF)

它不计算字符,而是比较中的 0 或非零值。

在我看来,一个更好的方法是读取整个字符串,修改它,然后以写入模式再次打开文件并写回,如果你要为内容分配一个数组.

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多