通过向字符串添加 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 它的指针。
我正在尝试创建一个向字符串添加下划线的填充函数。字符串长度应为 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 它的指针。