通过向字符串添加 char 来填充字符串

padding string by adding char to the string

我正在尝试创建一个向字符串添加下划线的填充函数。字符串长度应为 16,如果字符串小于 16,函数应添加下划线直到字符串长度为 16,然后 return 填充字符串。如果字符串超过 16 个,填充函数应忽略字符并 returned 字符串的前 16 个字符。

char* padding(char* plaintext) {
    char ch = '_';
    size_t len = strlen(plaintext);
    size_t lench = 17 - len;
    char *p_text = malloc(len + 1 + 1);
    strcpy(p_text, plaintext);
    
    if (len < 17) {
        int i;
           
        for (i = lench; i < 16; i++) {
            p_text[i] = ch;
        }
    }
        
    // p_text[17] = '[=10=]';
    return p_text;
}
     
int main() {
    char *key = "0123456789ABCDEF"; 
       
    while (1) {
        char plaintext[WIDTH + 1];
            
        printf("Enter a string: ");
        fgets(plaintext, WIDTH + 1, stdin);
           
        if (plaintext[0] == '\n' || plaintext[0] == '\r') 
            break;
            
        char* padded_plaintext = padding(plaintext);
        printf("padded plaintext = %s\n", padded_plaintext);
          
        printf("\n");
            
    }
    
    return 0;
}

此代码 return 是一个奇怪的结果。

分配给p_text的space不应该依赖于输入。它应始终为 17。如果 len + 1 + 1 < 16,则访问 p_text[i] 将导致您正在使用的 i 的某些值出现未定义的行为。您应该更换:

char *p_text = malloc(len + 1 + 1);

char *p_text = malloc(17);

并在写入之前检查 p_text 是否为 NULL。

另外,注释掉的//p_text[17] = '[=17=]';是错误的。应该是

p_text[16] = '[=12=]';

考虑一个干净的解决方案来解决这个问题。希望看到这个(以及随附的解释)有所帮助。

char *padded_string(char *src, int width, char ch) {
    char *dest = calloc(1, width + 1);

    strncpy(dest, src, width);

    for (int i = 0; i < width; i++) {
        if (!dest[i]) {
            dest[i] = ch;
        }
    }

    return dest;
}

我们通过使用 calloc 分配 width + 1 字节来为自己提供一个干净的工作平台。使用 calloc 将确保所有字节都设置为 0。在 C 中使用字符串时,它们需要以 null 终止,因此这非常有用。

我们将src的内容复制到dest中。如果源字符串比我们想要结束的字符串长,使用 strncpy 确保我们不会得到缓冲区溢出。

接下来我们循环 0, width 次。如果 i 处的目标字符串中的字符是 '[=21=]',我们将在该索引处插入填充字符。

现在,因为我们使用了 calloc 并且我们分配了一个超出我们需要的字符长度的额外字节,字符串已经以 null 结尾,我们可以简单地 return 它的指针。