簡體   English   中英

為什么以下語句不起作用?

[英]Why doesn't the following statement work?

今天我進行了測試,其中寫下了以下問題,並且由於我是C ++的新手,所以我對以下問題感到困惑。

為什么以下語句不起作用?

char str[ ] = "Hello" ;
strcat ( str, '!' ) ;
char str[] = "Hello";
strcat (str, '!') ;

strcat第二個參數必須是指向字符串的指針,但是您正在傳遞字符常量。

正確的調用應該是strcat(str, "!"); (請注意, "而不是“ ' ),但您還需要在str保留足夠大的空間,該空間僅足以容納"Hello"字符串。例如,對於您的測試,可以使用char str[64] = "Hello";保留更多字節char str[64] = "Hello";

strcat()調用兩個參數的指針。

'!' 將以實現定義的方式轉換為(很多機會無效)指針,然后程序可能因Segmentation Fault崩潰。

注意

char str[ ] = "Hello" ;
strcat ( str, "!" ) ;

由於缺乏緩沖,效果也不佳。

char str[ ] = "Hello" ;
strcat ( str, '!' ) ;
              ^^^ --- this is of type char

strcat的簽名是:

char * strcat ( char * destination, const char * source );
                                    ^^^^^^^^^^^^^^^^^^^

因此,第二個參數的類型為const char*而不是char 您必須傳遞字符串文字或const char*類型的變量。 實際上,字符串文字的類型為const char[]但在分配給它們時會衰減為const char*

strcat函數需要兩個字符串。 '!' 是一個角色。 為了安全地進行連接,您的數組必須足夠大以容納另一個字符串,因此請更改'!' "!" ,並且str[]str[8]或更多。

int main(void)
{
    char str[20] = "Hello" ;
    strcat ( str, "!" ) ;
    printf("%s\n",str);

}

兩個問題:

  1. 直接的問題是第二個參數必須是const char* strcat從該位置開始讀取內存,直到達到\\0 如果無法達到\\0則功能行為未定義。

  2. 您需要確保str足夠大以接收串聯的字符串。 如果不是,則行為是不確定的。

在第二點上,您可以編寫類似char str[100] = "Hello"; 這將保留100個字節的內存,並用Hello\\0填充前6個元素。

您為什么決定這些陳述

char str[ ] = "Hello" ;
strcat ( str, '!' ) ;

不工作?:)

一切都取決於函數strcat的定義方式。

例如,可以通過以下方式定義

char * strcat( char *s, char c )
{
    size_t n = std::strlen( s );
    if ( n ) s[n-1] = c;

    return s;
}

或以下方式

char * strcat( char *s, char c )
{
    size_t n = std::strlen( s );
    char *t = new char[n + 2];

    std::strcpy( t, s );

    t[ n - 2 ] = c;
    t[ n - 1 ] = '\0';

    return t;
}

如果您的示例中的strcat是標准的C函數std::strcat那么這並不意味着該語句將不起作用。 這意味着帶有此類語句的程序將不會編譯,因為第二個參數的類型錯誤。

但是,如果像這樣為第二個參數指定正確的值

strcat ( str, "!" ) ;

那是使用字符串文字而不是字符文字,那么實際上這些語句將無法正常工作,因為數組str沒有足夠的空間來附加字符串文字"!"

數組至少應定義為

char str[7] = "Hello" ;
        ^^^

該函數應該像

strcat ( str, "!" ) ;
              ^^^

暫無
暫無

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

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