【发布时间】:2021-11-12 18:23:21
【问题描述】:
我正在尝试创建一个向字符串添加下划线的填充函数。字符串长度应为 16,如果字符串小于 16,则函数应添加下划线,直到字符串长度为 16,然后返回填充字符串。如果字符串超过 16 个,填充函数应该忽略字符并返回字符串的前 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] = '\0';
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;
}
这段代码返回了一个奇怪的结果。
【问题讨论】:
-
您为
p_text分配的空间不应依赖于输入。它应该始终是 17。 -
while(1)循环中有内存泄漏很好地证明了为什么这是一个糟糕的 api。您可能应该让调用者传入一个缓冲区,其中将写入填充字符串,而不是mallocing 空间。如果您使用malloc,请确保您使用free。