有啥方法可以使用 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;
【讨论】:
定义两个substr
s有什么好处?
@PeterA.Schneider 这使得使用sizeof
成为可能。或者,您可以编写memcpy(&string[zeroes], "1234", sizeof("1234"));
,但这会导致代码重复,因此更容易出错且不易维护。但是考虑到人为的要求,这个例子当然有点傻。
哦,我明白了,错过了。【参考方案3】:
您的代码的行为是未定义。
您可以通过写char string [15] = '\0';
来解决这个问题。这会将所有字符串内存初始化为零(第一个字符显式设置为\0
,后续字符默认初始化为零)。
目前发生的情况是strcat
遍历string
,直到找到一个空终止符,然后才连接"abcd"
。由于您的memset
以及我在您假设string
在您编写char string [15];
时已初始化为0 时已经提到的那一点未定义的行为,该过程目前正在发出两个额外的字符
【讨论】:
以上是关于有啥方法可以使用 memcpy() 将值复制到特定的字符串位置?的主要内容,如果未能解决你的问题,请参考以下文章