【问题标题】:Problem while returning a pointer to a string in C在C中返回指向字符串的指针时出现问题
【发布时间】:2019-06-15 06:22:56
【问题描述】:

我正在编写一个代码,其中函数“verif”应该验证字符串中的字符是否不同。然后为文件中的每一行调用此函数。然而,虽然我验证了并且函数没问题,但关于指针的返回或主函数中的属性,我做错了一些事情。我得到的结果是文件每一行的'null null null'(我的文件有3行) 这是我的代码:

#include <stdio.h>
#include <stdlib.h>


char* verif (char line[])
{
    int i,j,ok=1;
    char v[5];
    for (i=0; i<strlen(line); i++)
    {
        for (j=i+1; j<strlen(line); j++)
        {
            if (line[i]==line[j])
            {
                ok=0;
                break;
            }
        }
    }
if (ok==0) strcpy(v,"No");
else strcpy(v,"Yes");

return v;

}


int main()
{
    FILE *f;
    char sir[30];
    char* ctrl;
    if ((f=fopen("fis.txt","r"))==NULL) exit(1);


    while (fscanf(f,"%[^\n]",sir))

    {
        if (fgetc(f)==EOF) break;
        puts(sir);
        ctrl=verif(sir);
        printf("%s",*ctrl);}





    }

【问题讨论】:

  • 您返回的是一个局部变量的地址,从函数返回时该地址不再有效。
  • 试试return ok==0 ? "No" : "Yes";
  • @osiris 我应该在我的函数中修改什么以便在不执行 Hawk 建议的情况下工作?
  • @MaryPoppins 副本的链接包含一些方法。您可以使用malloc 分配空间或使数组static

标签: c arrays string function


【解决方案1】:

您正在使用语句 return v; 从函数返回局部变量的地址

您的选择:

  • v 声明为static,以便它进入进程的数据部分,而不是函数的本地堆栈。
  • 使用堆 (malloc/free) 来管理 v 中的字符串,因为堆上的对象如果没有被释放,则在它们声明的作用域的生命周期之外仍然存在。

【讨论】:

  • 所以我应该有 'char* verif (char line[], char* ctrl)' 和 'return ctrl' ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 2013-09-27
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
相关资源
最近更新 更多