使用指针选择两个字符串中最长的一个
Selecting the longest of two strings using pointers
我目前正在备考,在过去的一篇论文中遇到了以下问题:
"写一个接受两个字符串的函数。计算其中的个数
每个字符,以及 return 指向长字符串的指针。你可以
扩展提供的功能以完成解决方案:"
main()
{
return 0;
}
这就是我目前所知道的,我很确定我已经接近了,但它不会在标准输出上打印任何东西,我在其他问题上也遇到过这个问题,所以如果有人能指出我正确的方向会对我有很大帮助!
#include <stdio.h>
#include <string.h>
int main(void)
{
printf("The longest is %s", longest("HELLO", "HELLOO"));
return 0;
}
int longest(char *string1, char *string2)
{
char longer;
if (strlen(string1)>strlen(string2)){
longer=*string1;
}
else {
longer=*string2;
}
return longer;
}
您需要解决最长函数的几个问题:
int longest(char *string1, char *string2) // 1) why return int ?
{
char longer; // 2) why char? it should be pointer
if (strlen(string1)>strlen(string2)){
longer=*string1; // 3) this is just one char, rather than a string
}
else {
longer=*string2;
}
return longer;
}
这是修复这些问题的示例:
const char* longest(const char *string1, const char *string2)
{
const char *longer;
if (strlen(string1)>strlen(string2)){
longer=string1;
}
else {
longer=string2;
}
return longer;
}
你太接近了!
您的 longest()
函数打算 return 一个 字符串 ,但它实际上是 returning 单个字符,这就是轮子都掉了
相反,我们将 longer
变量从 char
重新定义为 char *
,这是一个指向字符串的指针。现在它将 return 两个字符串中较长的一个。
#include <stdio.h>
#include <string.h>
char *longest(char *, char *);
int main(void)
{
printf("The longest is %s\n", longest("HELLO", "HELLOO"));
return 0;
}
char * longest(char *string1, char *string2)
{
char *longer;
if (strlen(string1) > strlen(string2)){
longer = string1;
}
else {
longer = string2;
}
return longer;
}
此版本还添加了一些内务处理,以便在使用 longest
函数之前对其进行声明,以便编译器了解所涉及的类型。
事实证明你可以稍微简化一下函数:
char *longest(char *s1, char *s2)
{
return strlen(s1) > strlen(s2) ? s1 : s2;
}
这个版本和你的版本一样,任意决定如果字符串的长度实际上相同,它会让第一个字符串获胜 - 不清楚这对你是否重要。
EDIT @Vlad 指出该解决方案不能正确处理 const char *
指针,当然他是对的。我故意将其排除在外,因为我没有编写一个普遍有用的函数,并且相信这超出了 OP 的要求。
但是弗拉德是对的,所以我在这里包括他的版本:
char * longest( const char *s1, const char *s2 )
{
return ( char * )( strlen( s1 ) < strlen( s2 ) ? s2 : s1 );
}
这是 C 语言中很难真正做好的地方之一:函数 longest()
实际上并不修改任何指向的字符串,因此它能够轻松处理这些 const
字符串,但是当它 returns 其中之一时,它从指针中删除了 const-ness,这真的是你能做的最好的事情:其他库函数以这种方式工作。
如果 C 有函数重载(一个版本用于 const
,一个版本不用于),或者一些特殊的独角兽键盘将参数的 const
-ness 传递给 return 值,但是 - 唉 - 它没有。
这是一个比 OP 可能关心的更高级的主题,但值得注意的是更广泛的受众。谢谢弗拉德。
作业中写着
...and return a pointer to the long string.
但是您的函数具有 return 类型 int
并且在函数中存在没有意义的赋值
char longer;
//…
longer=*string1;
//…
return longer;
并且函数必须在使用前声明。
函数可以看成下面的样子
char * longest( const char *s1, const char *s2 )
{
return ( char * )( strlen( s1 ) < strlen( s2 ) ? s2 : s1 );
}
这是一个演示程序。
#include <stdio.h>
#include <string.h>
char * longest( const char *s1, const char *s2 )
{
return ( char * )( strlen( s1 ) < strlen( s2 ) ? s2 : s1 );
}
int main(void)
{
char *s1 = "HELLO";
char *s2 = "HELLOO";
puts( longest( s1, s2 ) );
return 0;
}
它的输出是
HELLOO
解决方案:
#include <stdio.h>
#include <string.h>
const char * longest(const char *string1, const char *string2)
{
const char * longer;
if (strlen(string1)>strlen(string2)){
longer=string1;
}
else {
longer=string2;
}
return longer;
}
int main(void)
{
printf("The longest is %s", longest("HELLO", "HELLOO"));
return 0;
}
您的代码中的问题:
在 C 中,您必须先声明(不一定要实现,但需要定义签名)函数,然后才能在代码中引用它。见 this link;
您的 return 类型是 int
而不是作业要求的 pointer to string
。因此,变量 longer
和函数 longest
的 return 类型都需要是 char *
.
类型
很高兴拥有:
- 使用
const
向函数的调用者保证不会对字符串进行任何修改。
我目前正在备考,在过去的一篇论文中遇到了以下问题:
"写一个接受两个字符串的函数。计算其中的个数 每个字符,以及 return 指向长字符串的指针。你可以 扩展提供的功能以完成解决方案:"
main()
{
return 0;
}
这就是我目前所知道的,我很确定我已经接近了,但它不会在标准输出上打印任何东西,我在其他问题上也遇到过这个问题,所以如果有人能指出我正确的方向会对我有很大帮助!
#include <stdio.h>
#include <string.h>
int main(void)
{
printf("The longest is %s", longest("HELLO", "HELLOO"));
return 0;
}
int longest(char *string1, char *string2)
{
char longer;
if (strlen(string1)>strlen(string2)){
longer=*string1;
}
else {
longer=*string2;
}
return longer;
}
您需要解决最长函数的几个问题:
int longest(char *string1, char *string2) // 1) why return int ?
{
char longer; // 2) why char? it should be pointer
if (strlen(string1)>strlen(string2)){
longer=*string1; // 3) this is just one char, rather than a string
}
else {
longer=*string2;
}
return longer;
}
这是修复这些问题的示例:
const char* longest(const char *string1, const char *string2)
{
const char *longer;
if (strlen(string1)>strlen(string2)){
longer=string1;
}
else {
longer=string2;
}
return longer;
}
你太接近了!
您的 longest()
函数打算 return 一个 字符串 ,但它实际上是 returning 单个字符,这就是轮子都掉了
相反,我们将 longer
变量从 char
重新定义为 char *
,这是一个指向字符串的指针。现在它将 return 两个字符串中较长的一个。
#include <stdio.h>
#include <string.h>
char *longest(char *, char *);
int main(void)
{
printf("The longest is %s\n", longest("HELLO", "HELLOO"));
return 0;
}
char * longest(char *string1, char *string2)
{
char *longer;
if (strlen(string1) > strlen(string2)){
longer = string1;
}
else {
longer = string2;
}
return longer;
}
此版本还添加了一些内务处理,以便在使用 longest
函数之前对其进行声明,以便编译器了解所涉及的类型。
事实证明你可以稍微简化一下函数:
char *longest(char *s1, char *s2)
{
return strlen(s1) > strlen(s2) ? s1 : s2;
}
这个版本和你的版本一样,任意决定如果字符串的长度实际上相同,它会让第一个字符串获胜 - 不清楚这对你是否重要。
EDIT @Vlad 指出该解决方案不能正确处理 const char *
指针,当然他是对的。我故意将其排除在外,因为我没有编写一个普遍有用的函数,并且相信这超出了 OP 的要求。
但是弗拉德是对的,所以我在这里包括他的版本:
char * longest( const char *s1, const char *s2 )
{
return ( char * )( strlen( s1 ) < strlen( s2 ) ? s2 : s1 );
}
这是 C 语言中很难真正做好的地方之一:函数 longest()
实际上并不修改任何指向的字符串,因此它能够轻松处理这些 const
字符串,但是当它 returns 其中之一时,它从指针中删除了 const-ness,这真的是你能做的最好的事情:其他库函数以这种方式工作。
如果 C 有函数重载(一个版本用于 const
,一个版本不用于),或者一些特殊的独角兽键盘将参数的 const
-ness 传递给 return 值,但是 - 唉 - 它没有。
这是一个比 OP 可能关心的更高级的主题,但值得注意的是更广泛的受众。谢谢弗拉德。
作业中写着
...and return a pointer to the long string.
但是您的函数具有 return 类型 int
并且在函数中存在没有意义的赋值
char longer;
//…
longer=*string1;
//…
return longer;
并且函数必须在使用前声明。
函数可以看成下面的样子
char * longest( const char *s1, const char *s2 )
{
return ( char * )( strlen( s1 ) < strlen( s2 ) ? s2 : s1 );
}
这是一个演示程序。
#include <stdio.h>
#include <string.h>
char * longest( const char *s1, const char *s2 )
{
return ( char * )( strlen( s1 ) < strlen( s2 ) ? s2 : s1 );
}
int main(void)
{
char *s1 = "HELLO";
char *s2 = "HELLOO";
puts( longest( s1, s2 ) );
return 0;
}
它的输出是
HELLOO
解决方案:
#include <stdio.h>
#include <string.h>
const char * longest(const char *string1, const char *string2)
{
const char * longer;
if (strlen(string1)>strlen(string2)){
longer=string1;
}
else {
longer=string2;
}
return longer;
}
int main(void)
{
printf("The longest is %s", longest("HELLO", "HELLOO"));
return 0;
}
您的代码中的问题:
在 C 中,您必须先声明(不一定要实现,但需要定义签名)函数,然后才能在代码中引用它。见 this link;
您的 return 类型是
int
而不是作业要求的pointer to string
。因此,变量longer
和函数longest
的 return 类型都需要是char *
. 类型
很高兴拥有:
- 使用
const
向函数的调用者保证不会对字符串进行任何修改。