[英]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);
}
兩個問題:
直接的問題是第二個參數必須是const char*
。 strcat
從該位置開始讀取內存,直到達到\\0
。 如果無法達到\\0
則功能行為未定義。
您需要確保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.