有啥方法可以使用 memcpy() 将值复制到特定的字符串位置?

Posted

技术标签:

【中文标题】有啥方法可以使用 memcpy() 将值复制到特定的字符串位置?【英文标题】:Is there any way I can copy values into a specific string position using memcpy()?有什么方法可以使用 memcpy() 将值复制到特定的字符串位置? 【发布时间】:2016-12-06 11:38:45 【问题描述】:

我正在努力寻找使用 string.h 函数 memset(...)、memcpy(...) 和 strcat(...) 获取以下字符串的方法:

0000001234abcd

我需要使用 memcpy,如果不返回字符串的开头,我找不到这样做的方法。

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

void main () 
    char string [15];

    memset((void *)string,'0',6*sizeof(char));
    memcpy(string,"1234",4);
    strcat(string,"abcd");

    printf("String: %s\n",string);
 

输出-> 字符串:123400abcd

如果有人提出一个想法,我将不胜感激。

【问题讨论】:

您是否可能想写memset((void *)string,'\0',6*sizeof(char)); 而不是... 'o' ...? IE。您想写入值为 0 的字节,以便保证字符串终止,而不是值为 48 的字节(ASCII 值“0”)。 (我现在明白了,可能没有,或者你应该设置所有 15 个字节。) 【参考方案1】:

你有两个主要问题:

忘记在使用memcpy 时指定偏移量 应用strcat 时没有终止字符串空值

试试这个:

char string [15] = 0;

memset(string,'0',6);
memcpy(string + 6,"1234",4);
strcat(string,"abcd");

printf("String: %s\n",string);

输出:0000001234abcd

【讨论】:

【参考方案2】:

学究版:

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

int main (void)

  char string [15];
  const char substr1 [] = "1234";
  const char substr2 [] = "abcd";
  const size_t zeroes = 6;

  memset(string, '0', zeroes);
  memcpy(&string[zeroes], substr1, sizeof(substr1)); // includes null term
  strcat(string, substr2);

  printf("String: %s\n", string);
  return 0;
 

【讨论】:

定义两个substrs有什么好处? @PeterA.Schneider 这使得使用sizeof 成为可能。或者,您可以编写memcpy(&amp;string[zeroes], "1234", sizeof("1234"));,但这会导致代码重复,因此更容易出错且不易维护。但是考虑到人为的要求,这个例子当然有点傻。 哦,我明白了,错过了。【参考方案3】:

您的代码的行为是未定义

您可以通过写char string [15] = '\0'; 来解决这个问题。这会将所有字符串内存初始化为零(第一个字符显式设置为\0,后续字符默认初始化为零)。

目前发生的情况是strcat 遍历string,直到找到一个空终止符,然后才连接"abcd"。由于您的memset 以及我在您假设string 在您编写char string [15]; 时已初始化为0 时已经提到的那一点未定义的行为,该过程目前正在发出两个额外的字符

【讨论】:

以上是关于有啥方法可以使用 memcpy() 将值复制到特定的字符串位置?的主要内容,如果未能解决你的问题,请参考以下文章

memcpy 可以用于类型双关语吗?

有啥方法可以防止大于特定大小的文件被上传? [复制]

EXCEL 有啥方法可以将每个迭代结果复制到单独的表中?

memcpy问题,如图,memcpy下一个复制的数据会覆盖掉原有数据,有没有啥方法可以把新的数据加到原有数据

VBA代码将值从一个单元格复制到特定列

将值从多个工作簿复制到主文件中的特定单元格