免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2977 | 回复: 12
打印 上一主题 下一主题

函数返回值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-29 14:09 |只看该作者 |倒序浏览
请教各位下面这个函数有什么问题?
char *SysSetGetDir(char *filename)
{
    char *dir;

    if (*filename == 0)
    {
        return NULL;
    }
    dir = filename + strlen(filename) - 1;

    while (dir > filename && *dir != '\\')
    {
        dir --;
    }

    if (dir == filename)
    {
        return NULL;
    }
    else
    {
        *dir = 0;
     return dir;
    }
}

论坛徽章:
0
2 [报告]
发表于 2009-08-29 14:31 |只看该作者
返回值要是char *类型

论坛徽章:
0
3 [报告]
发表于 2009-08-29 15:30 |只看该作者
*dir = 0;
return dir;

在*dir之后,filename的值就是你想要的文件夹路径,这里返回dir的值有意义吗? 要返回的话也是return filename, 但这样感觉整个函数结构好乱

最好还是把要返回的值单独分配内存空间,不要改变原来filename的值

[ 本帖最后由 rollin7 于 2009-8-29 15:44 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-08-29 15:45 |只看该作者
dir是局部变量,这样返回是不是会有问题?

论坛徽章:
0
5 [报告]
发表于 2009-08-29 15:54 |只看该作者
不是dir的问题,你dir不是已经指向filename了吗?
所以当SysSetGetDir函数返回时,filename的地址并没有被释放,那dir指向的也是个有效空间

SysSetGetDir("c:\\test.c");

执行到*dir = 0之前
你dir的字符串为"\\test.c"

这时*dir =0,
那filename的字符串则变为了"c:"

你说应该返回什么?

论坛徽章:
0
6 [报告]
发表于 2009-08-29 15:56 |只看该作者
总之我建议这种函数像你这样处理很不合理,原则上最好不要改变filename的值

论坛徽章:
0
7 [报告]
发表于 2009-08-29 16:30 |只看该作者
麻烦不麻烦?一点都不直观。

1、函数名称 SysSetGetDir 是什么意思?到底 Set 还是 Get?
2、这是用 C# 写的版本:

string GetFileDir(string filename)
{
    if (filename != null && filename.Length != 0
            && filename.IndexOf('\\') != -1 && filename[filename.Length - 1] != '\\')
        return filename.Substring(0, filename.LastIndexOf('\\'));
    else
        return filename;
}




[ 本帖最后由 langue 于 2009-8-29 16:55 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-08-29 17:52 |只看该作者
手动搜网的过程中Sleep

论坛徽章:
0
9 [报告]
发表于 2009-08-29 17:58 |只看该作者
原帖由 caojengineer 于 2009-8-29 15:45 发表
dir是局部变量,这样返回是不是会有问题?


你的理解有误。
C的函数不是不能返回局部变量。而是不要返回指向局部变量的指针。

论坛徽章:
0
10 [报告]
发表于 2009-08-29 19:07 |只看该作者
【1】
        char* fileName = "c:\\aaa\\d";
        char* a = SysSetGetDir(fileName);
会异常,因为fileName 指向的是只读区域

【2】
        char* fileName = "/home/ddd/ccc";
        char* a = SysSetGetDir(fileName);
居然得不到目录。。。其实移植性还是应该考虑一下的

【3】
        char* fileName = (char*)malloc(56);
        strcpy(fileName, "c:\\aa\\bb");
        char* a = SysSetGetDir(fileName);
居然也得不到东西。
     *dir = 0;
     return dir;
如前面网友所说,这一段逻辑有问题。

[ 本帖最后由 gussing 于 2009-8-29 19:13 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP