簡體   English   中英

使用指針選擇兩個字符串中最長的一個

[英]Selecting the longest of two strings using pointers

我目前正在准備考試,在過去的論文中遇到了以下問題:

“編寫一個接受兩個字符串的函數。計算每個字符串中的字符數,並返回一個指向長字符串的指針。您可以擴展提供的函數以完成解決方案:”

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;
}

你離得那么近!

您的longest()函數打算返回一個string ,但它實際上返回一個字符,這就是輪子全部脫落的地方。

相反,我們將longer變量從char重新定義為char * ,它是一個指向字符串的指針。 現在它將返回兩個字符串中較長的一個。

#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;
}

此版本與您的版本一樣,任意決定如果字符串的長度實際上相同,則第一個字符串將獲勝 - 不清楚這對您是否重要。

編輯@Vlad 指出這個解決方案沒有正確處理const char *指針,當然他是正確的。 我故意忽略了這一點,因為我沒有編寫一個通用的函數,並且相信這超出了 OP 的要求。

但弗拉德是對的,所以我在這里包括他的版本:

char * longest( const char *s1, const char *s2 )
{
    return ( char * )( strlen( s1 ) < strlen( s2 ) ? s2 : s1 );
}

這是 C 語言中很難做得很好的那些搖擺不定的領域之一:函數longest()實際上並不修改任何指向的字符串,因此它能夠輕松處理這些const字符串,但是當它返回一個時其中,它從指針中刪除了常量,這確實是您能做的最好的事情:其他庫函數以這種方式工作。

如果 C 具有函數重載(一個版本用於const ,一個版本用於非),或者某些特殊的獨角獸鍵盤將參數的const帶入返回值,那就太好了,但是 - 唉 - 它沒有。

這是一個比 OP 可能關心的更高級的主題,但對於更廣泛的受眾來說值得注意。 謝謝弗拉德。

作業里寫着

...並返回一個指向長字符串的指針。

但是您的函數具有返回類型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

您需要解決最長函數的幾個問題:

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;
}

解決方案:

#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;
}

您的代碼中的問題:

  1. 在 C 中,您必須在代碼中引用函數之前聲明(不一定實現,但簽名需要已經定義)。 請參閱此鏈接

  2. 您的返回類型是int而不是pointer to string分配請求的pointer to string 因此,變量longer和函數的返回類型longest需要是char *類型。

很高興擁有:

  • 使用const確保const的調用者不會對字符串進行任何修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM