【问题标题】:How to concatenate pointer arrays? [duplicate]如何连接指针数组? [复制]
【发布时间】:2012-05-07 10:03:28
【问题描述】:

可能重复:
concatenate char array in C

如何连接:

char *a="abcd";
char *b="1234";

使用 strcat()?当用户输入 *a 和 *b 时回答相同?

EDIT 错过了这一点:不使用另一个数组。

【问题讨论】:

  • "当用户输入 *a 和 *b 时回答相同?" - 这有什么用?可以预期哪些其他用户输入?为什么?
  • 唯一棘手的部分是预先分配目标(例如 char str[20]="";)并调用 strcat 两次 (strcat(str,a); strcat(str,b); )
  • 你的程序中是否真的有动态确定的字符串,或者你真的只有文字字符串常量?在后一种情况下,您可以在编译时使用数组和sizeof 完成大部分工作。

标签: c arrays pointers


【解决方案1】:

您不能随意使用已经初始化的字符串文字 - 它们位于内存中的某个位置并且不能/不应该被重写。

如果您不想要另一个静态定义的数组但不介意动态分配,下面的代码可能会完成您正在寻找的内容:

char *a = "abcd";
char *b = "1234";
char *out;

if((out = (char *)malloc(strlen(a) + strlen(b) + 1)) != NULL)
{
   strcpy(out, a);
   strcat(out, b);
}
else
{
   //you don't have enough memory, handle it
}

如果这仍然不可接受,请考虑另一种方法来初始化字符串文字。

【讨论】:

    【解决方案2】:

    你需要创建一个目标位置,有足够的空间来容纳你想要连接的所有东西。

    char newchar[50];
    
    strcpy(newchar, a); //per the comment
    strcat(newchar, b);
    

    【讨论】:

    • @TonyTheLion:IIUC,第一个电话应该是strcpy
    【解决方案3】:

    如何在不使用另一个数组的情况下连接

    这是不可能的。 a 和 b 都只是指向驻留在 ROM 中的字符串文字的指针。您尚未分配任何可读取数据的内存。

    你可以这样做:

    char a[9] = "abcd";
    const char* b = "1234";
    strcat(a, b);
    

    在这里,您将“a”静态分配为 RAM 中的 9 个字节,足以容纳 8 个符号 + 1 个字节用于字符串终止。

    【讨论】:

      【解决方案4】:

      复制多个字符串的典型方法是创建一个足够大的缓冲区,将第一个字符串复制出来,然后将剩余的字符串一个接一个地连接起来。然而,字符串操作经常充满错误——安全漏洞——你应该格外小心。

      我建议你阅读这篇文章:strlcpy and strlcat - consistent, safe, string copy and concatenation

      编辑关于 OP 的编辑:

      不使用另一个数组

      你没有任何数组开始。您有指向只读字符串文字的 char 类型的指针。您不能修改任何一个字符串。这样做会调用未定义的行为。但是,您可以读取这些字符串并将其复制到其他字符串(您拥有其内存——无论是在堆栈上还是在堆上——因此可以修改)。

      【讨论】:

        【解决方案5】:

        编辑:以下答案适用于编辑问题之前的 OP 问题。

        你不能那样做。但是您可以将字符串连接成一个字符数组。您必须确保字符数组有足够的空间用于连接字符串。这是一个例子:

        char *a = "abcd";
        char *b = "1234";
        char arr[10] = {0};
        
        strcat(arr, a);
        strcat(arr, b);
        printf("%s\n", arr);
        

        注意:为什么 arr[] 需要初始化为 0 是你的功课。 :)

        【讨论】:

          【解决方案6】:

          我认为以下功能应该可以工作

          void stcat (char *str1, char *str2)
          {
              int i = 0,len = 0;
              while(*(str1+len)!='\0')
              len++;
                 while(*(str2+i)!='\0')
             {
                     *(str1+len) = *(str2+i);
                     i++;
                     len++;
             }
             *(str1+len) = '\0';
          }
          

          【讨论】:

          • 这就是我想出来的。但它会导致运行时错误。
          • 你不能使用它,因为没有分配数组,只是驻留在 ROM 中的常量字符串文字。
          猜你喜欢
          • 1970-01-01
          • 2021-11-17
          • 1970-01-01
          • 1970-01-01
          • 2021-02-21
          • 2013-05-04
          • 1970-01-01
          • 1970-01-01
          • 2022-10-04
          相关资源
          最近更新 更多