【发布时间】: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