C语言中如何在字符串中插入多个字符

2024-01-05

我想在C中的字符串中插入一些字符:

例子:char string[100] = "20120910T090000";

我想让它像"2012-09-10-T-0900-00"

到目前为止我的代码:

void append(char subject[],char insert[], int pos) {
    char buf[100]; 

    strncpy(buf, subject, pos); 

    int len = strlen(buf);

    strcpy(buf+len, insert); 

    len += strlen(insert);  

    strcpy(buf+len, subject+pos); 
    strcpy(subject, buf);   
}

当我第一次打电话时,我得到:2012-0910T090000

然而,当我第二次调用它时,我得到:2012-0910T090000-10T090000

任何帮助表示赞赏


这是一些工作代码,它给出了输出:

String: <<20120910T090000>>
String: <<2012-0910T090000>>
String: <<2012-09-10T090000>>
String: <<2012-09-10-T090000>>
String: <<2012-09-10-T-090000>>
String: <<2012-09-10-T-0900-00>>

It uses memmove()因为可以保证被复制的字符串重叠。

#include <assert.h>
#include <string.h>
#include <stdio.h>

static void insert(char *str, size_t len, char c, size_t pos)
{
    memmove(&str[pos+1], &str[pos], len - pos + 1);
    str[pos] = c;
}

int main(void)
{
    char string[25] = "20120910T090000";
    // I want to make it something like "2012-09-10-T-0900-00"
    char inschr[] = "-----";
    int  inspos[] = { 4, 7, 10, 12, 17 };
    enum { NUMCHR = sizeof(inschr) / sizeof(inschr[0]) };
    enum { NUMPOS = sizeof(inspos) / sizeof(inspos[0]) };
    assert(NUMCHR == NUMPOS + 1);
    size_t length = strlen(string);

    printf("String: <<%s>>\n", string);
    for (int i = 0; i < NUMPOS; i++)
    {
        insert(string, length, inschr[i], inspos[i]);
        length++;
        printf("String: <<%s>>\n", string);
    }
    return(0);
}

当然,我假设 C99 支持for循环符号。另请注意,在经典 C 风格中,代码不获取目标字符串的大小,因此不能确保不存在缓冲区溢出。添加参数并进行检查并不那么困难;问题在于如何指示该功能失败。您可以使用该函数的不同接口,将任意长度的字符串插入到任意位置;这并不是特别困难...

String: <<20120910T090000>>
String: <<2012-0910T090000>>
String: <<2012-09-10T090000>>
String: <<2012-09-10-T090000>>
String: <<2012-09-10-T-090000>>
String: <<2012-09-10-T-0900-00>>

#include <assert.h>
#include <string.h>
#include <stdio.h>

static int insert(char *str, size_t max, size_t len, char *ins, size_t pos)
{
    assert(str[len] == '\0');
    assert(len < max);
    size_t inslen = strlen(ins);
    if (len + inslen + 1 >= max)
        return -1;
    memmove(&str[pos+inslen], &str[pos], len - pos + inslen);
    memmove(&str[pos], ins, inslen);
    return len + inslen;
}

int main(void)
{
    char string[25] = "20120910T090000";
    // I want to make it something like "2012-09-10-T-0900-00"
    char *insstr[] = { "-", "-", "-", "-", "-" };
    int   inspos[] = {   4,   7,  10,  12,  17 };
    enum { NUMSTR = sizeof(insstr) / sizeof(insstr[0]) };
    enum { NUMPOS = sizeof(inspos) / sizeof(inspos[0]) };
    size_t length = strlen(string);
    assert(NUMSTR == NUMPOS);

    printf("String: <<%s>>\n", string);
    for (int i = 0; i < NUMPOS; i++)
    {
        int newlen = insert(string, sizeof(string), length, insstr[i], inspos[i]);
        if (newlen < 0)
        {
            printf("Oops! failed to insert [%s] into [%s]\n", insstr[i], string);
            break;
        }
        length = newlen;
        printf("String: <<%s>>\n", string);
    }
    return(0);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言中如何在字符串中插入多个字符 的相关文章

随机推荐

  • 我可以在 XtraGrid 上将行单元格值设置为只读吗?

    如何在 XtraGrid 上使特定行单元格只读 不可编辑 例如 仅适用于 row 0 但不是所有行 您可以使用GridView CustomRowCellEdit http documentation devexpress com Wind
  • 警告:您将留下 1 个提交,未连接到任何分支

    Egit再次出击 我犯了一个错误 试图切换到 EGit 中的另一个分支 结果不知何故搞砸了 没有检查到任何分支 然后我对这个非分支进行了提交 然后当我意识到我没有跟踪正确的分支时 我运行了以下命令 git checkout issue2 W
  • css 标签的 html head 之间的有效区别?:@import url 与 link href

    之间是否存在有效差异 and 浏览器的行为是否有所不同 w3c等推荐什么 您应该使用的原因有几个代替 import 其中 2 个是 Using import可能会导致下载方式出现意外的排序 The import可能会导致空白白屏问题 htt
  • 嵌套宏扩展

    我不确定这是否是正确使用的术语 但是我的问题是宏调用 PLUGIN NAME 作为另一个宏调用 IMPLMENT MODULE 的参数 这反过来将其打印为字符串 打印该参数作为宏调用 somePLUGIN NAME 而不是扩展结果 some
  • 将 MySQL 查询结果显示为每行 HTML 表

    我尝试搜索 但没有找到任何对我有帮助的内容 所以我创建了一个新线程 我有一个包含多个列的 MySQL 数据库 每行都是一个项目的一组单独的数据 现在我已经设法将其显示得非常接近我想要的内容 但是为了获得更好的视图 我需要将其格式化为两列表
  • 从 MainMenu 获取特定菜单项

    我有一个包含窗口的笔尖 winA xib 我的应用程序委托包含一个名为 WinAController 的 NSWindowController 子类 WinAController 有一个属性 NSMenu mainMenu 我想将其指向Ma
  • 如何在react-slick轮播中执行slickNext方法?

    我有以下带有 Slick 轮播的 React 应用程序 我创建了一个自定义的 下一步 按钮 需要执行slickNext 方法继续到下一张幻灯片 Slick 轮播文档和一些问题的答案都提到了以下调用方式slickNext method 问题是
  • 在 Mac 10.9.5 上安装 PyCrypto 时出错

    我正在尝试为 Python 3 4 安装 PyCrypto 但 C 编译的程序出现问题 它说 错误 无法运行C编译的程序 有人知道如何修复它吗 code running build running build py running buil
  • 包含/排除 gulp.src 的 glob

    我正在尝试为我的 javascript concat 构建任务设置一个 glob 数组gulp 目录结构如下 about about js assets contact core navbar navbar js navbar test j
  • 使用 Gitlab 管道和 git 推送防止无限循环

    我有一个项目 其中有 4 个环境 开发 测试 暂存和生产 每个环境都有分支 分别是开发 测试 暂存主机 我们用npm version插入版本package json还要添加一个 git 标签 之后我们运行构建并成功后 我们推送由npm ve
  • ValueError:没有足够的值来解压(预期为 2,实际为 1)

    以下是我的代码 views py from django shortcuts import render from forms import MedicineForm from models import Medicine def inde
  • 将点击事件绑定到td vs table

    我想在 HTML 中构建类似 excel 的实用程序 假设我的 table id myTbl 有 20 行和 20 列 每当用户单击它并使用 td 文本作为其值时 我想在 td 内添加文本框 Suppose my table is 我有两个
  • 调用非托管函数 char 返回 char *

    我在非托管 C C 代码 dll 中有一个函数 它返回包含 char 数组的结构 我创建了 C 结构体来接收调用该函数时的返回值 调用此函数后 我得到 System Runtime InteropServices MarshalDirect
  • 如何仅在父元素中应用变换?

    我有 HTML div style color white height 1080px width 100 div class player controls a class right carousel control href span
  • 转换为 Web 应用程序错误 - 无法解析 aspx 文件

    我偶尔会在我的 aspx 文件中遇到错误 这些错误是由设计器文件的问题引起的 发生这种情况时 我删除设计器文件 右键单击 aspx 文件并选择 转换为 Web 应用程序 通常重新生成设计器文件效果很好 但有时我会收到一个错误 简单地说 无法
  • 如何将 NSBezierPath 附加到 CAShapeLayer

    我想知道是否有人可以帮忙 基本上我下面有一些 Objective C 代码 有谁知道如何将其附加到 Mac OS X 而不是 iOS 的 CAShapeLayer 上 Color Declarations NSColor fillColor
  • 如何配置VSCode的Organize Imports顺序?

    我想配置组织导入的顺序 此刻 它动了node modules相关的导入语句位于最顶部 以及本地ts文件位于最底部 Normal import myFunction from myFunction import fs from fs cons
  • 使 R 中 selectInput 的第一个元素闪亮显示为粗体

    我希望将 selectInput 的第一个元素 1 设置为粗体颜色 请帮忙 ui lt fluidPage selectInput select label h3 Select box choices c 1 2 3 4 server lt
  • clang 编译器的“-Weverything”选项包括什么以及它的记录在哪里?

    clang 但不是 gcc 有一个 Weverything选项哪个appears包括诸如 Wpedantic 您可以在这里测试 https godbolt org z qcYKd1 https godbolt org z qcYKd1 请参
  • C语言中如何在字符串中插入多个字符

    我想在C中的字符串中插入一些字符 例子 char string 100 20120910T090000 我想让它像 2012 09 10 T 0900 00 到目前为止我的代码 void append char subject char i