1

我有这样的函数,它得到 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 在这里不起作用?我能做些什么来完成这项工作?

4

3 回答 3

0

问题出在下面的语句中。

a[i]="hello ";

您无需复制字符串文字,而是为其分配地址。

改为使用

strcpy( a[i],"hello " );
于 2013-11-11T20:21:29.040 回答
0

首先,everya[i]指向一个字符串文字并修改它会调用未定义的行为

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

因此,x应该分配内存并仔细检查,您应该使用strncat以避免意外溢出。

于 2013-11-11T20:27:10.090 回答
0

这是您的问题的根源:

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 ");
}
于 2013-11-11T20:27:43.473 回答