【问题标题】:Why is char* foo() returning empty string?为什么 char* foo() 返回空字符串?
【发布时间】:2020-08-27 14:30:27
【问题描述】:

我正在编写一个 C 代码,它检查一个单词(由用户输入)在文本文件中出现的次数,打印每行的计数,以及屏幕上的总计数,并将该单词与文件的最后一个字。

我有一个专门的函数来获取最后一个名为“Fetch”的单词,该函数获取单词并将其返回给主函数。然后另一个函数计算出现次数,然后是第三个函数,它使用 strcmp() 实际比较两个字符串。

我的问题是函数 char* Fetch() 似乎出于某种原因返回了空字符串。请注意,我想检查问题实际出在哪里,所以我尝试在屏幕上的函数内打印结果,而不是将其返回到 main() 并且它起作用了!!,所以看起来,问题是返回语句,什么可能是问题?

char* Fetch() 在 main() 中调用:

//step 3: fetch the last word in the file
Lword = Fetch();
printf("the last word is %s", Lword);

char* Fetch():

char* Fetch()
{
    char text[1000];
    fread(text, sizeof(char), sizeof(text), spIn);
    for(int i = 0; i < strlen(text); i++)
    {
        if(isspace(text[strlen(text) -1 -i])) //if space
        {
            return (text + (strlen(text)-i));  //return a pointer to the element after the space
        }
    }


}

main 中的声明:

char Uword[20], *Lword;
int TotalCount;

【问题讨论】:

  • 1.您返回指向当函数返回时停止存在的数组的指针,2. 有时函数在没有return 语句的情况下到达末尾
  • 拆分这个函数,它做的太多了。您需要的是一个从文件中读取数据的函数,以及一个识别最后一个单词的单独函数。
  • 不要像这样一次又一次地打电话给strlen(text)。只需将结果存储到变量中

标签: c string file pointers return


【解决方案1】:

您在函数 Fetch 中分配了一个本地字符缓冲区 text 并将数据存储到。

当 Fetch 函数返回时,缓冲区 text 将被释放,内容不再被使用。

Function Fetch 可以这样改变:

char* Fetch(char *text, size_t maxlen, FILE *spIn)
{
    fread(text, sizeof(char), maxlen, spIn);
    for(int i = 0; i < strlen(text); i++)
    {
        if(isspace(text[strlen(text) -1 -i])) //if space
        {
            return (text + (strlen(text)-i));  //return a pointer to the element after the space
        }
    }
    return text;
}

并且可以这样调用:

FILE *spIn = ...
char text[1000] = {'\0'};
char *res = Fetch(text, sizeof(text), spIn);
printf("the last word is: %s\n",res);

记得在 text 缓冲区仍然有效时使用它。

【讨论】:

  • 那么,你的意思是如果'text'在本地声明,它会在return语句之前释放??而且,当我应用您的更改时,第一次运行导致文件的最后一个单词正确(我们称之为“指令”),但后面是随机字符。第二次运行给了我正确的结果,没有多余的字符。传递另一个字符串'text2'会导致同样的问题,但总是如此。我通过初始化字符串 text[1000] = {'\0'} 解决了这个问题,请自行尝试
  • 感谢您的通知。我已经编辑了答案并修复了这个错误。是的。返回时会释放局部变量,然后内存可能会被其他变量、函数调用等占用。
猜你喜欢
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 2011-05-08
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
相关资源
最近更新 更多