“编写函数any( s1,s2),它返回字符串s1中的第一个位置,其中出现字符串s2中的任何字符;如果s1不包含s2中的字符,则为-1。(标准库函数strpbrk做同样的工作,但返回指向该位置的指针。”
我想知道在循环中放置返回语句是否是一个坏习惯,而不是像我在这里所做的那样使用"char_match = YES“:
#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怎么办?这很糟糕吗?我应该找个不同的方法来做这个吗?
发布于 2014-08-13 22:19:44
回答你的问题:
return i-1;很好。因此,您当然可以将该代码重写为:
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;
}或者,我可能会写这样的东西:
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(),它将为您完成几乎所有的工作。
发布于 2014-08-13 22:22:26
使用多个return语句的唯一原因可能是在退出函数之前需要进行任何类型的清理。例如,如果为特定函数中的几个指针分配内存,则需要确保在这些语句之前释放所有这些指针。在您的特殊情况下,在循环中有一个return是非常好的,因为您不会与任何内存管理冲突。
发布于 2014-08-13 22:25:01
对于它是否更好地使用多个返回,没有有效的解析器,但是请记住--如果采用多次返回路径--您必须考虑资源释放(文件句柄、malloc等),因为在C中没有其他语言(C++、Java等)中的任何工具。
下面是使用多个返回的代码,其中我返回i而不是i - 1 (这是正常的,因为++i是在循环^结束之前执行的)。
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这样的多变量初始化。
https://stackoverflow.com/questions/25297099
复制相似问题