在C中填充零

9avjhtql  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(115)

我得给短的位串加0,但如果这对

str1  = 0011
str2  = 0101111100011

但如果
x一个一个一个一个x一个一个二个x
输出:

0000000000011
011

期望产量

0000000000011
0101111100011
ct2axkht

ct2axkht1#

您的diff没有显示差异。
可以使用memmove和memset执行以下任务:

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);
    }
}

请记住,str1str2必须是可修改的,并且足够大以容纳填充字符串。

oxf4rvwz

oxf4rvwz2#

为了填充一个字符串,包含它的缓冲区必须有足够的空间用于填充和原始字符串,并且它必须是可修改的,否则结果将是Undefined Behaviour
字符串文本是不可修改的,不应传递给此类函数。
由初始化决定大小的数组(例如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

相关问题