【发布时间】:2020-07-19 21:55:25
【问题描述】:
将 MPLABX 5.35 与 XC16 v1.36 一起用于 PIC24FJ128GB204。有限的c背景,但正在学习。
我正在尝试编写一个函数,该函数采用 char 数组(大小未知)中的(指向 a)字符串并就地编辑它以使其右对齐并用字符填充它,直到它具有请求长度。 由于我也想为其他项目保留此功能,因此源数组的大小将是未知的,但用户(我)应保持 targetLength 小于数组的大小。
想象一下数组:
char example[20] = "test";
我希望能够将它传递给具有所需长度(例如,10 个字符,包括空终止)和填充字符“#”的函数,它应该将数组就地编辑为“#####测试”
我想出的代码(仅适用于某些场合,因此无法使用):
uint16_t fillStringRight(char * source,
uint16_t targetLength,
char filler)
{
uint16_t sourceLength = strlen(source) + 1;
if (sourceLength > targetLength){
// source length is already longer than requested
return 0;
}
uint16_t reqFiller = targetLength - sourceLength;
strcpy(&source[reqFiller], source);
memset(source, filler, reqFiller -1);
return 1;
}
但是,在这种情况下:
char source[20] = "test";
fillStringRight(source, 6, ' ');
这不起作用。如果我理解正确,源和结果重叠,所以 strcpy 将覆盖空终止符,从而继续进一步写入内存,直到看门狗重新启动 PIC。
第一个问题:我的理解正确吗?
我想我应该复制源字符串而不是就地编辑它。但是,我不知道字符串的长度,所以我无法确定将用于复制的 char 数组的大小(除非我把它做得大得离谱)。我阅读了有关 malloc 以在堆中创建一个大小在运行时确定的变量,但也阅读了在微控制器上使用 malloc 的内容。我还不明白为什么,所以宁愿避开它,直到我理解得更好。
第二个问题:正确的方法是什么?我可以编写一个向后工作的函数(从最后一个位置的空终止符开始,然后向后工作),但这似乎有很多开销。有没有更好的办法?
【问题讨论】:
-
尝试使用
memmove:memmove(&source[reqFiller], source, sourceLength) -
@S.S.Anne 和 Stef1611:谢谢。 Memmove 是可行的选择。我没有想到用“重叠”这个词来描述我的问题,这样可以更容易地找到答案。谢谢。