在c语言中编写一个备用的_Case函数?
我编写了这个函数,虽然它不起作用:在c语言中编写一个备用的_Case函数?,c,C,我编写了这个函数,虽然它不起作用: char *alternateCase (char *string) { while (*string) { if (islower(*string)) *string = toupper(*string); else if (isupper(*string)) *string = tolower(*string); string++; } return string; } 因此,我尝试添加一个指向字符串变量的指
char *alternateCase (char *string)
{
while (*string)
{
if (islower(*string)) *string = toupper(*string);
else if (isupper(*string)) *string = tolower(*string);
string++;
}
return string;
}
因此,我尝试添加一个指向字符串变量的指针,它成功了,第二个函数如下所示:
char *alternateCase (char *string)
{
char *ptr= string;
while (*ptr)
{
if (islower(*ptr)) *ptr = toupper(*ptr);
else if (isupper(*ptr)) *ptr = tolower(*ptr);
ptr++;
}
return string;
}
我不完全理解为什么第一个函数不起作用,而第二个函数起作用。在我看来,他们是一模一样的!
为什么第二个是对的,而第一个是错的?您需要保存指向字符串开头的指针。在第一个示例中,您正在更改作为函数参数接收的指针。因此,您需要保留原始指针,并使用临时指针
*ptr
,如第二个示例所示
或者,您可以使用第一个示例,但是您应该保存字符串长度
int length = strlen(string);
然后
return (char*)(string - length);
您需要保存指向字符串开头的指针。在第一个示例中,您正在更改作为函数参数接收的指针。因此,您需要保留原始指针,并使用临时指针
*ptr
,如第二个示例所示
或者,您可以使用第一个示例,但是您应该保存字符串长度
int length = strlen(string);
然后
return (char*)(string - length);
第一个发布的示例代码不起作用的原因是因为这两行代码
string++;
and
return string;
当while循环退出时,指针string
指向终止输入参数字符串的NUL字节
返回修改后的指针会导致调用者收到指向NUL字节的指针。不是需要的。第一个发布的示例代码不起作用的原因是因为这两行代码
string++;
and
return string;
当while循环退出时,指针string
指向终止输入参数字符串的NUL字节
返回修改后的指针会导致调用者收到指向NUL字节的指针。不是需要的。第二个函数返回一个指向字符串开头的指针,但第一个函数返回一个指向字符串结尾的指针(因为您在第一个函数中更改了
string
)。谢谢,这很有效,我尝试在while循环while(n--){string--;}
中n是strlen(string)
及其作用。提示:尝试使用for()
循环,而不是while()
。循环中的尾随字符串++;
可能是错误源(请考虑:中断/继续)是的,谢谢,我只是想在不使用任何索引变量的情况下编写函数。第二个函数返回指向字符串开头的指针,但第一个函数返回指向字符串结尾的指针(因为您在第一个函数中更改了string
)。谢谢,这是有效的,我尝试在while循环while(n--){string-->
之后添加它,其中n是strlen(string)
并且它是有效的。提示:尝试使用for()
循环,而不是while()
。循环中的尾部string++
可能是错误的来源(请思考:break/continue)是的,我只是想在不使用任何索引变量的情况下编写函数,谢谢。它应该是return(char*)(字符串长度)
@MuhammadEbeid.是的,对不起。你的while循环有点奇怪,所以让人困惑。这是一种不好的做法吗?它有多奇怪?@MuhammadEbeid.不,这不是一种不好的做法,但我只是经常使用来解决类似这样的问题。但是你可以使用任何方法和你想要的任何循环。我也经常使用来解决循环,但是我试图不使用任何索引变量。它应该是return(char*)(字符串长度)
@MuhammadEbeid.是的,对不起。你的while循环有点奇怪,所以让人困惑。这是一种不好的做法吗?它有多奇怪?@MuhammadEbeid.不,这不是一种不好的做法,但我只是经常使用来解决类似这样的问题。但是你可以使用任何方法和你想要的任何循环。我也经常使用来解决循环,但是我试图不使用任何索引变量。