我得给短的位串加0,但如果这对
str1 = 0011 str2 = 0101111100011
但如果x一个一个一个一个x一个一个二个x输出:
0000000000011 011
期望产量
0000000000011 0101111100011
ct2axkht1#
您的diff没有显示差异。可以使用memmove和memset执行以下任务:
diff
void addLeadingZero(char* str1 , char* str2) { size_t len1 = strlen(str1); size_t len2 = strlen(str2); char *wrk = len1 > len2 ? str2 : str1; size_t diff = len1 > len2 ? (len1 - len2) : (len2 - len1); if(diff) { memmove(wrk + diff, wrk, len1 > len2 ? len2 + 1 : len1 + 1); memset(wrk, '0', diff); } }
请记住,str1和str2必须是可修改的,并且足够大以容纳填充字符串。
str1
str2
oxf4rvwz2#
为了填充一个字符串,包含它的缓冲区必须有足够的空间用于填充和原始字符串,并且它必须是可修改的,否则结果将是Undefined Behaviour。字符串文本是不可修改的,不应传递给此类函数。由初始化决定大小的数组(例如char foo[] = "bar";)将不包含任何额外的填充空间。动态分配的缓冲区可以使用realloc调整大小以创建空间,或者可以为结果分配新的缓冲区。对于不同的方法,使用标准库函数:使用memmove将现有字符串移向缓冲区的末尾。使用memset填充差距。下面是一个简单的示例,其中缓冲区的大小被显式调整为具有足够的空间:
char foo[] = "bar";
realloc
memmove
memset
#include <stdio.h> #include <string.h> void pad(char *string, size_t length, size_t new_length) { size_t diff = new_length - length; memmove(string + diff, string, length + 1); memset(string, '0', diff); } int main(void) { char a[64] = "123"; char b[64] = "456789"; size_t a_len = strlen(a); size_t b_len = strlen(b); if (a_len > b_len) pad(b, b_len, a_len); else if (b_len > a_len) pad(a, a_len, b_len); puts(a); puts(b); }
输出:
000123 456789
2条答案
按热度按时间ct2axkht1#
您的
diff
没有显示差异。可以使用memmove和memset执行以下任务:
请记住,
str1
和str2
必须是可修改的,并且足够大以容纳填充字符串。oxf4rvwz2#
为了填充一个字符串,包含它的缓冲区必须有足够的空间用于填充和原始字符串,并且它必须是可修改的,否则结果将是Undefined Behaviour。
字符串文本是不可修改的,不应传递给此类函数。
由初始化决定大小的数组(例如
char foo[] = "bar";
)将不包含任何额外的填充空间。动态分配的缓冲区可以使用
realloc
调整大小以创建空间,或者可以为结果分配新的缓冲区。对于不同的方法,使用标准库函数:
使用
memmove
将现有字符串移向缓冲区的末尾。使用
memset
填充差距。下面是一个简单的示例,其中缓冲区的大小被显式调整为具有足够的空间:
输出: