【问题标题】:Strcat, 2 char arrays of pointersStrcat,2个char指针数组
【发布时间】:2013-11-11 20:17:05
【问题描述】:

我有这样的函数,它获取 2 个数组作为 char 参数,我需要合并这些字符串。抱歉,这个问题很简单。

    void Abc (char **a, char **b)
{

    for (int i = 0; i < 200; i++)
    {
        a[i]="hello ";
    }

    for (int i = 0; i < 200; i++)
    {
        strcat(a[i], b[i]);       //doesn't show mistake, but it's there
        cout << b[i]<<'\n';        //ok
        cout << a[i]<<'\n';        //ok
        cout<<strlen(b[i])<<'\n';  //ok
        cout<<strlen(a[i])<<'\n';  //ok
    }
}

为什么 Strcat 在这里不起作用?我可以做些什么来完成这项工作?

【问题讨论】:

  • strncat() 需要三个参数。
  • 如果我使用 strcat 它也不起作用
  • 您不能修改字符串文字。将指针指向字符串文字 const char * 是一个好主意,并且是 C++11 标准所要求的。
  • 如果 'a' 指向可以保存你的字符串 "hello" 和 strcat 之后的结果字符串的东西,你可以通过在你的第一个循环中重新分配给 "hello" 来有效地破坏这种可能性。

标签: c++ arrays pointers char strcat


【解决方案1】:

这是您的问题的根源:

for (int i = 0; i < 200; i++)
{
    a[i]="hello ";

编译器不知道你在这里的意图,所以a[] 的每个元素都被分配了一个指向相同字符串的指针

a[0] == a[1] == a[2] == a[3] == a[4] == ... a[199]

即使这样可行,问题是 a now 的所有元素都指向大小为 7 的 char 数组{'h', 'e', 'l', 'l', 'o', 0}。你不能stract到他们的末尾。

您需要确保a[] 的每个元素都有一个指向唯一存储空间的指针,并且它足够大以接收您的字符串。如果你的 a[] 元素已经指向某个有效的地方,你需要做的是:

for (int i = 0; i < 200; i++)
{
    strcpy(a[i], "hello ");
}

【讨论】:

    【解决方案2】:

    首先,每个a[i] 都指向一个字符串文字并对其进行修改会调用未定义的行为。

    其次,当你是strcat(x, y) 时,你应该确保x 有足够的空间来存储合并的x 和y。

    因此,x 应该已经分配了内存并且要仔细检查,你应该使用strncat 以避免意外溢出。

    【讨论】:

      【解决方案3】:

      问题出在下面的语句中。

      a[i]="hello ";
      

      您分配它的地址而不是复制字符串文字。

      改为使用

      strcpy( a[i],"hello " );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-26
        • 1970-01-01
        • 2019-09-19
        • 2018-04-05
        • 2019-01-15
        • 1970-01-01
        • 2012-03-19
        • 1970-01-01
        相关资源
        最近更新 更多