【问题标题】:How to concatenate a char array case [0] and [1] to a char pointer in C?如何将 char 数组 case [0] 和 [1] 连接到 C 中的 char 指针?
【发布时间】:2014-04-09 02:52:43
【问题描述】:

我想连接两个字符'7'和'9'来形成这个字符串“79”。

首先,我初始化了变量。 (限制:我只能使用 char 类型,并且不能创建另一个 charac 类似的变量。)

char *charac = (char *) malloc(sizeof(char) * 200);
char *combined = (char *) malloc(sizeof(char) * 200);

然后我给出了 charac[0] 和 charac[1] 的值。

charac[0] = '7';
charac[1] = '9';
printf("charac[0] : %c\n", charac[0] );
printf("charac[1] : %c\n", charac[1] );

我想连接 charac[0] 和 charac[1]

strcpy(combined, (char*)charac[0]);
strcat(combined, (char*)charac[1]);
printf("combined : %s\n", combined);
free(combined);

但上面的代码不起作用。我收到错误消息:“警告:从不同大小的整数转换为指针”。

在阅读了您所有的cmets和建议后,我得到了我想要的输出结果。

这是最终代码:

char *charac = (char *) malloc(sizeof(char) * 200);
        char *combined = (char *) malloc(sizeof(char) * 200);

        charac[0] = '7';
        charac[1] = '9';
        charac[2] = '\0';
        printf("charac[0] : %c\n", charac[0] );
        printf("charac[1] : %c\n", charac[1] );
        printf("charac[2] : %c\n", charac[2] );

        strcpy(combined, & charac[0]);
        strcat(combined, & charac[1]);
        strcpy(combined, & charac[0]);
        strcat(combined, & charac[2]);
        printf("combined : %s\n", combined);
        free(combined);

【问题讨论】:

  • charac[2] = '\0';之后,你已经在charac中合并了。
  • 请阅读 C-String 是什么。顺便说一句:string 有解释。
  • 最大的编译问题是charac[0]不是指针,所以(char*)charac[0]肯定会产生问题。你必须使用&charac[0]。也就是说,您可能应该阅读更多关于 C 字符串的内容。
  • @zneak 我使用 &charac[] 形式,它似乎工作,但最后一个 charac[] 重复两次。我得到的不是 79,而是 799。我怎样才能让它停止重复两次?没关系,我想我可能会找到我的解决方案。

标签: c arrays pointers char concatenation


【解决方案1】:

它们已经按原样连接。这是因为它们在内存中彼此相邻。您已将它们声明在同一个数组中,并在相邻的索引处。

+---------------+
|  '7'  |  '9'  |
+---------------+
   [0]     [1]

这是您在内存中的数组。七个 (charac[0]) 紧邻九个 (charac[1])。 正如 cmets 中所建议的,只需 null 终止数组即可完成串联。

charac[2] = '\0';

该数组现在是 printf() 友好的,因为它是空终止的。

【讨论】:

  • 我添加 charac[2] = '\0';我是否添加 strcat(combined, (char*) charac[2]);也?我仍然收到警告消息。
【解决方案2】:

C 中的字符串由单个字符和一个空字符(零字节)组成。所以字符串“79”的长度为3。

字符串被放入字符数组存储中。您可以在堆上分配它,但仅声明一个数组更简单。所以代码是:

char charac[3];
charac[0] = '7';
charac[1] = '9';
charac[2] = '\0';  // or just 0

更简单:

char charac[3] = { '7', '9' };   // the 0 just happens

更简单:

char charac[] = "79";

这三段代码中的每一段都做同样的事情。


作为对评论的回应,C 标准中对初始化聚合的处理定义如下:n1570 S6.7.9/21:

如果大括号括起来的列表中的初始值设定项少于元素或成员的数量 用于初始化已知数组的字符串文字中的聚合或更少字符 大小超过数组中的元素,聚合的其余部分应为 隐式初始化与具有静态存储持续时间的对象相同。

换句话说,任何时候你使用大括号初始化,剩下的项目都是零填充的。

【讨论】:

  • 您的示例 char charac[3] = { '7', '9' }; // the 0 just happens 不正确。如果它是在全局范围内声明的(但它依赖于未定义的行为),这是正确的,但如果它是在函数中声明的,则不一定是正确的......
  • @nonsensickle:想打赌吗? 50 美元?
  • $50 请classes.mst.edu/compsci53/ntca.htm 参见简介部分。
  • 是的,我确实注意到了。我花了大约 30 分钟在 ideone 上尝试制作一个人为的示例,该示例将在没有成功的情况下崩溃。你知道它在标准中在哪里谈到这个吗?
  • 谢谢! +1。 (不仅是标准参考,其余部分也是准确且信息丰富的)。
猜你喜欢
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 2018-09-26
  • 2023-03-17
相关资源
最近更新 更多