【问题标题】:Using fgetc to read words?使用 fgetc 读取单词?
【发布时间】:2014-10-21 00:57:03
【问题描述】:

我想逐个字符地读取文本文件,然后对字符和单词做一些事情。这是我的实现:

char c;
char* word="";
fp = fopen("text.txt","rt");
do
{
    c = (char)fgetc(fp);
    if(c == ' ' || c == '\n' || c == '\0' || c == '\t')
    {
        //wordfunction(word)
        word = ""; //Reset word
    }
    else
    {
        strcat(word, &c); //Keeps track of current word
    }
    //characterfunction(c);
}while(c != EOF);

fclose(fp);

但是,当我尝试运行此程序时,我的程序会立即崩溃。将单词设置为“”有问题吗?如果是这样,我应该怎么做?

【问题讨论】:

  • strcat(word, &c); 错误。 "" 是没有可以绑定字符串的空间。 &c 不是 C_String。也 c 可能会模拟 EOF。
  • 1) 它将准备足够大的区域。例如char word[1024]; 2) 使用动态字符串。
  • 什么是动态字符串?
  • 喜欢根据字符的添加自动增大尺寸。

标签: c c-strings fgetc


【解决方案1】:

在您的单词变量初始赋值中,您指向一个长度为 0 的静态字符串。当您尝试将数据写入其中时,您将覆盖其他内容并且您的程序将停止运行。相反,您需要为您的文字预留空间。

你在哪里

char* word="";

改用

char word[100];

这将为您的单词创建一个 100 个字符的空间。

char c;
char word[100];
fp = fopen("text.txt","rt");
int index = 0;
do {
  c = (char)fgetc(fp);
  if(c == ' ' || c == '\n' || c == '\0' || c == '\t') {
    //wordfunction(word)
    word[0] = 0; //Reset word
    index = 0;
  } else {
    word[index++] = c;
    word[index] = 0;
    //strcat(word, &c); //Keeps track of current word
  }
  //characterfunction(c);
} while(c != EOF);

fclose(fp);

【讨论】:

  • 那我如何每次重设单词呢?
  • 词尾由'\0'定义。一种方法是将初始字符设置为 '\0',如 word[0] = 0;
  • 该代码有效,但是您详细解释了为什么 word[0] = 0 的代码;以我想要的方式“重置”字符串?
  • C 字符串以空字符终止。这意味着定义字符串结尾的是字符 0。处理字符串的系统函数会查找该字符以确定字符串的结尾位置。也就是说,如果您将第一个字符设置为 0,则表示该字符串中没有字符。
  • strcat() 已损坏,因此仅此更改无法修复代码。
【解决方案2】:
  1. word 指向一个常量区域,strcat 不允许写入,所以你的代码被转储了;
  2. word 应该有足够的空间来保留字符,尝试硬编码或realloc(word, size_t)

  3. 这可以用gcc -o编译:

int main(){ char c; char word[1000] = {0}; //enough space FILE* fp = fopen("text.txt","rt"); int index = 0; assert(0 != fp); do { c = (char)fgetc(fp); if(c == ' ' || c == '\n' || c == '\0' || c == '\t') { //wordfunction(word) index = 0; } else { word[index++] = c; } //characterfunction(c); }while(c != EOF); word[index] = 0; fclose(fp); return 0; }

【讨论】:

  • 糟糕,抱歉,我的错误 - 删除了我原来的评论。
  • @BLUEPIXY 你只是告诉我“有很多错误”并投反对票并逃跑,为什么不列出一些“错误”?
  • Why c=(char)fgetc(fp); is bad。而 \\ 不是你做 cmets 的方式。而do{}while() 是一个空文件的问题。
  • 1. fgetc来自这个问题,问@user2154420; 2. \\ 是我的错误,对不起。 3.do{}while()空文件没问题,你试过了吗?
猜你喜欢
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 2011-07-08
相关资源
最近更新 更多