【问题标题】:Appending a char to a string using arrays and strcat [closed]使用数组和 strcat 将字符附加到字符串 [关闭]
【发布时间】:2018-09-12 16:32:16
【问题描述】:

两个变量:string0string1。两者都是char * 类型。我想做的是将string0的第i个元素添加到string1的末尾。由于string0[i]char,我不能简单地使用strcat(string1, string0[i])

不过,我有其他想法:

char string0i[2] = {string0[i], '\0'};
strcat(string1, string0i);

但这会导致分段错误。为什么以及如何实现我想要的,即将string0的第i个元素附加到string1

【问题讨论】:

  • 为了正确使用strcat(),第一个参数中必须有足够的空间来容纳它和你连接到它的任何东西。如果没有足够的空间,剩余的信息将溢出其范围并导致分段错误。
  • @Tau 哦...是的。那么……还有其他方法吗?
  • 计算所需大小并将结果存储在该大小的变量中。如果在编译时不知道大小,则需要使用 malloc()calloc() 从堆中获取此空间。
  • 如果您对strcat 的文档不清楚,您应该在教科书中学习C 字符串、数组和指针。您还将了解如何正确编写初始化程序等。这是一堂基础课。
  • @toohonestforthissite 我的初始化程序有什么问题?

标签: c arrays string pointers char


【解决方案1】:

strcat 添加字符?矫枉过正。

 char *addchar(char *dest, const char *src, size_t nth)
{
     size_t len = strlen(dest);
     dest[len++] = src[nth];
     dest[len] = 0;
     return dest;
}

【讨论】:

  • 当然,无论是通过strcat(),还是通过其他方式完成,目标数组中必须有可用空间,否则结果进入一个新的更大的数组。
  • @JohnBollinger 首先 - C 标准库字符串函数假设有一个空格并且正确分配是程序员的问题。其次,很明显调用者必须为这个字符保留足够的空间。
  • 对你我来说很明显,调用者必须确保有足够的空间,但经验表明,对于提出诸如这。因此,假设对于后来阅读答案的许多人来说也不是显而易见的,这似乎是安全的。
  • @JohnBollinger strcpy 相同。这是基本的C知识。我知道初学者确实会考虑。
【解决方案2】:

试试这样的

/* strncat example */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main ()
{
  char * string0="whatever";
  char * string1="whoever";
  size_t l = strlen(string1);
  char * str1 = malloc(l+2);
  strcpy (str1,string1);
  int i=3;
  int len = 1;
  strncat (&(str1[l]), &(string0[i]), len);
  //you can also simply do
  //str1[l] = string0[i];
  //str1[l + 1] = 0;
  puts (str1);
  return 0;
}

你分配了一个有足够空间的变量,因此strlen(string1)+2 然后使用strcpy 将string1 复制到更大的变量中,而您想要的函数是strncat(请参阅http://www.cplusplus.com/reference/cstring/strncat/),它会附加有限数量的字符。

在上面的代码中,结果是

whoevert

【讨论】:

  • 使用 icc 可以很好地编译此代码。不需要 stdlib.h
  • 我使用 GCC,编译此代码会产生错误,但不包含 stdlib.h
  • 必须包含标题,否则它是缺少声明的 UB。所以,是的,stdlib.h 必须包括在内。您应该始终检查 malloc 等函数的错误。话说,代码对于一个简单的demo来说过于复杂了。
  • Shlemiel the painter。如果您已经确定了文本的位置 (strlen(str1)),请不要回到开头并再次测量 (strcat)。
  • @toohonestforthissite 在“现代”(即不超过 20 岁)中无需原型不再是 UB。这只是编译错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2016-03-02
  • 2011-01-18
  • 2010-11-20
相关资源
最近更新 更多