【问题标题】:C: How to append/concatenate 'x' spaces to a stringC:如何将'x'空格附加/连接到字符串
【发布时间】:2014-03-18 07:50:24
【问题描述】:

我想在 C 语言中为字符串添加可变数量的空格,并且想知道是否有标准方法可以做到这一点,然后我自己实现它。

直到现在我还是用了一些丑陋的方法来做到这一点:

  • 请假设在调用以下任何函数之前,我已注意为要连接的空间分配了足够的内存

这是我使用的一种方式:

add_spaces(char *dest, int num_of_spaces) {
    int i;
    for (i = 0 ; i < num_of_spaces ; i++) {
        strcat(dest, " ");
    }
}

这个性能更好,但看起来也不标准:

add_spaces(char *dest, int num_of_spaces) {
    int i;
    int len = strlen(dest);
    for (i = 0 ; i < num_of_spaces ; i++) {
        dest[len + i] = ' ';
    }
    dest[len + num_of_spaces] = '\0';
}

那么,你有什么标准的解决方案给我,这样我就不用重新发明轮子了吗?

【问题讨论】:

  • 你看过 memset 吗?我只是要求您注意缓冲区溢出。
  • 看看here。所有尝试都可以转换为简单的算法,您可以通过假设和优化来提高它们的性能。主要问题是太授予dest 足够的空间来接收新字符。
  • 我假设目的地中的字符有足够的空间。问题是是否有一种标准方法可以在一个命令中生成这样的空格字符串
  • 正如其他人指出的那样,我相信memset 是答案。
  • @user3322273 你首先通过memsetmemset( dest, ' ', sizeof(dest)); 一样初始化你的dest 数组。所以在那之后你甚至不需要增加空间或者你的实现也被优化了。

标签: c string concatenation spaces


【解决方案1】:

我愿意

add_spaces(char *dest, int num_of_spaces) {
    int len = strlen(dest);
    memset( dest+len, ' ', num_of_spaces );   
    dest[len + num_of_spaces] = '\0';
}

但正如@self 所说,一个同时获得最大大小的函数(包括该示例中的'\0')更安全:

add_spaces(char *dest, int size, int num_of_spaces) {
    int len = strlen(dest);
    // for the check i still assume dest tto contain a valid '\0' terminated string, so len will be smaller than size
    if( len + num_of_spaces >= size ) {
        num_of_spaces = size - len - 1;
    }  
    memset( dest+len, ' ', num_of_spaces );   
    dest[len + num_of_spaces] = '\0';
}

【讨论】:

  • 不安全,dest 的总大小丢失。
  • @self 任何版本的add_spaces() 只接受这两个参数取决于调用者检查适当的大小。我将添加一个也采用最大尺寸的解决方案。
【解决方案2】:
void add_spaces(char *dest, int num_of_spaces) {
    sprintf(dest, "%s%*s", dest, num_of_spaces, "");
}

【讨论】:

  • 您能评论一下%*s 做了什么吗?
  • @NathanFellman 采用参数中指定的宽度。
  • 这可能是未定义的行为,确切地说是违反了 C99 的限制,但可能还可以。
  • 还有其他方法可以使用其他角色吗?例如。我想在一个命令中创建一串“x”破折号。
  • @user3322273 在标准函数中执行此操作的函数可能不存在。
【解决方案3】:

请假设在我调用以下任何函数之前,我 注意为我想要的空间分配足够的内存 连接

所以在main 中,假设您将数组声明为char dest[100],然后使用规范初始化您的字符串。

喜欢

char dest[100];
memset( dest,' ',sizeof(dest)); 

所以你甚至不需要add_spaces(char *dest, int num_of_spaces)

【讨论】:

  • 在空格后面设置一个0 会很好。另外,你的答案带来了什么,而不是上面@Ingo 的答案,比你早 28 分钟发布的?
猜你喜欢
  • 2022-01-21
  • 2020-01-17
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多