为什么以下陈述不起作用?

时间:2015-11-23 09:38:05

标签: c++ c

今天我做了一个测试,写了下面的问题,因为我是C ++的新手,我对以下问题感到困惑。

为什么以下声明无效?

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

4 个答案:

答案 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)

两个问题:

  1. 当前的问题是第二个参数必须是const char*strcat从该位置开始读取内存,直到达到\0。如果无法达到\0,则函数行为未定义。

  2. 由您来确保str足够大以接收连接的字符串。如果没有,则行为未定义。

  3. 在第二点,您可以编写类似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, "!" ) ;
              ^^^