今天我做了一个测试,写了下面的问题,因为我是C ++的新手,我对以下问题感到困惑。
为什么以下声明无效?
char str[ ] = "Hello" ;
strcat ( str, '!' ) ;
答案 0 :(得分:2)
char str[] = "Hello";
strcat (str, '!') ;
strcat
第二个参数必须是指向字符串的指针,但是你传递的是一个字符常量。
正确的调用是strcat(str, "!");
(注意"
而不是'
),但您还需要在str
中保留足够大的空间,持有"Hello"
字符串。例如,对于测试,您可以使用char str[64] = "Hello";
答案 1 :(得分:1)
strcat
函数需要两个字符串。'!'
是一个字符。
为了安全地连接,您的数组必须足够大以容纳其他字符串,因此将'!'
更改为"!"
,将str[]
更改为str[8]
或更多。
int main(void)
{
char str[20] = "Hello" ;
strcat ( str, "!" ) ;
printf("%s\n",str);
}
答案 2 :(得分:0)
两个问题:
当前的问题是第二个参数必须是const char*
。 strcat
从该位置开始读取内存,直到达到\0
。如果无法达到\0
,则函数行为未定义。
由您来确保str
足够大以接收连接的字符串。如果没有,则行为未定义。
在第二点,您可以编写类似char str[100] = "Hello";
的内容,这将保留100个字节的内存,使用Hello\0
填充前6个元素。
答案 3 :(得分:0)
你为什么决定这些陈述
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, "!" ) ;
^^^