c编程中的strcat函数原型

时间:2014-03-31 04:34:28

标签: c

我对C编程中的这个函数原型有疑问

char *strncat( char *s1, const char *s2, size_t n )

为什么第一个参数不是const而第二个参数是const?

int main(void)
{
    char *nameOne; 
    char nameTwo[11];
    char *pName = nameTwo;
    nameOne = "Moe Howard";

    strcpy(pName, "Larry Fine");

    strcat(nameOne,"shirin");
    printf("%s",nameOne);

    return 0;
}

它不起作用 任何提示?

2 个答案:

答案 0 :(得分:2)

因为strncat需要写入(s1)指向的字符缓冲区;但它只需要从(s2)指向的字符缓冲区中读取。

答案 1 :(得分:2)

人们经常误以为是什么

const char *s2;

实际上意味着。它是非常量指针常量字符。这意味着您不允许更改实际角色"背后"指针,虽然你可以将指针本身移动到你想要的任何地方(const char * const xyzzy;将字符锁定到指向不变值的指针,char * const xyzzy;将锁定指针但允许你要改变它指向的角色。)

这就是为什么第一个参数是char * - 将另一个(源)字符串连接到它的行为意味着您必须更改目标字符串的基础字符。

因为您根本不需要修改源字符串,所以可以const

您发布的代码不起作用的原因在于:

nameOne = "Moe Howard";
:
strcat (nameOne, "shirin");

您不能修改nameOne指向的字符串文字(嗯,可能可以工作,但不能保证)。这在C11 6.4.5 String literals /7中有具体指出,它讨论了C字符串包含的字符数组:

  

如果这些数组的元素具有不同的数据,则未指定   适当的价值观如果程序试图修改这样的数组,则行为是   未定义。

之所以如此,主要是因为编译器优化了字符串文字。例如,代码:

char *s1 = "defined";
char *s2 = "undefined";

可能导致以下内存布局,包含两个变量" sharing"基础数据:

          +------------------------------ s1
          |
          v
+---+---+---+---+---+---+---+---+---+----+
| u | n | d | e | f | i | n | e | d | \0 |
+---+---+---+---+---+---+---+---+---+----+
  ^
  |
  +-------------------------------------- s2