首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >K&R练习2-5

K&R练习2-5
EN

Stack Overflow用户
提问于 2014-08-13 22:14:19
回答 3查看 333关注 0票数 3

“编写函数any( s1,s2),它返回字符串s1中的第一个位置,其中出现字符串s2中的任何字符;如果s1不包含s2中的字符,则为-1。(标准库函数strpbrk做同样的工作,但返回指向该位置的指针。”

我想知道在循环中放置返回语句是否是一个坏习惯,而不是像我在这里所做的那样使用"char_match = YES“:

代码语言:javascript
复制
#define YES 1
#define NO 0
int char_seek(char string[], char string2[])
{
    int i, j;
    int char_match = NO;

    for (i = j = 0; string[i] != '\0' && char_match == NO; ++i){
        while (string2[j] != '\0' && string[i] != string2[j])
            ++j;
        if (string2[j] == '\0')
            j = 0;
        else if (string[i] == string2[j])
            char_match = YES;
    }
    if (char_match == NO)
        return -1;
    else
        return i-1;
}

返回i-1怎么办?这很糟糕吗?我应该找个不同的方法来做这个吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-13 22:19:44

回答你的问题:

  1. 有多个返回语句是可以的。
  2. 作为一个潜在的返回语句:return i-1;很好。

因此,您当然可以将该代码重写为:

代码语言:javascript
复制
int char_seek(char string[], char string2[])
{
    int i, j;

    for (i = j = 0; string[i] != '\0'; ++i){
        while (string2[j] != '\0' && string[i] != string2[j])
            ++j;
        if (string2[j] == '\0')
            j = 0;
        else if (string[i] == string2[j])
            return i;
    }

    return -1;
}

或者,我可能会写这样的东西:

代码语言:javascript
复制
int char_seek(const char *string, const char *string2) {
    for (int i = 0; string[i] != '\0'; ++i)
        for (int j = 0; string2[j] != '\0'; ++j)
            if (string[i] == string[j])
                return i;
    return -1;
}

我觉得这更容易读懂。

通常情况下,当您实现搜索函数时,我认为在循环中有一个return语句应该是首选的表示法。

另外,虽然我知道这是一个学习练习,但值得注意的是,string.h .h中有一个非常类似的函数,名为strpbrk(),它将为您完成几乎所有的工作。

票数 4
EN

Stack Overflow用户

发布于 2014-08-13 22:22:26

使用多个return语句的唯一原因可能是在退出函数之前需要进行任何类型的清理。例如,如果为特定函数中的几个指针分配内存,则需要确保在这些语句之前释放所有这些指针。在您的特殊情况下,在循环中有一个return是非常好的,因为您不会与任何内存管理冲突。

票数 2
EN

Stack Overflow用户

发布于 2014-08-13 22:25:01

对于它是否更好地使用多个返回,没有有效的解析器,但是请记住--如果采用多次返回路径--您必须考虑资源释放(文件句柄、malloc等),因为在C中没有其他语言(C++、Java等)中的任何工具。

下面是使用多个返回的代码,其中我返回i而不是i - 1 (这是正常的,因为++i是在循环^结束之前执行的)。

代码语言:javascript
复制
int char_seek(char string[], char string2[])
{
    int j = 0;
    for (int i = 0; string[i] != '\0'; ++i) {
        while (string2[j] != '\0' && string[i] != string2[j]) {
            ++j;
        }
        if (string2[j] == '\0') {
            j = 0;
        } else if (string[i] == string2[j]) {
            return i;
        }
    }
    return -1;
}

虽然使用多个返回并不是错误的,但您应该始终使用{}来分隔块(比如您的"else“)。您应该避免像i = j = 0这样的多变量初始化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25297099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档