在C语言中,padleft 并不是一个内置函数,但我们可以根据其字面意思(左填充)来实现一个自定义函数。padleft 通常用于在字符串的左侧填充指定的字符,直到字符串达到指定的长度。

(图片来源网络,侵删)
实现思路
- 输入参数:
str:原始字符串。width:目标宽度(即填充后的字符串长度)。pad_char:用于填充的字符。
- 逻辑:
- 如果原始字符串的长度已经大于或等于
width,则直接返回原字符串(或其拷贝)。 - 否则,计算需要填充的字符数量(
width - strlen(str)),并在字符串左侧填充这些字符。
- 如果原始字符串的长度已经大于或等于
- 返回值:
返回一个新的字符串(动态分配内存),调用者负责释放内存。
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* padleft(const char* str, int width, char pad_char) {
if (str == NULL) {
return NULL;
}
size_t len = strlen(str);
if (len >= width) {
// 直接返回原字符串的拷贝(避免修改原字符串)
char* result = malloc(len + 1);
if (result == NULL) {
return NULL;
}
strcpy(result, str);
return result;
}
// 需要填充的情况
char* result = malloc(width + 1); // +1 for null terminator
if (result == NULL) {
return NULL;
}
// 填充部分
int pad_len = width - len;
for (int i = 0; i < pad_len; i++) {
result[i] = pad_char;
}
// 原始字符串部分
strcpy(result + pad_len, str);
return result;
}
int main() {
const char* original = "hello";
int width = 10;
char pad_char = '0';
char* padded = padleft(original, width, pad_char);
if (padded != NULL) {
printf("Original: \"%s\"\n", original);
printf("Padded: \"%s\"\n", padded);
free(padded); // 释放动态分配的内存
}
return 0;
}
输出示例
Original: "hello"
Padded: "00000hello"
关键点说明
- 内存管理:
- 使用
malloc动态分配内存,调用者需要free释放。 - 如果输入字符串为
NULL,直接返回NULL。
- 使用
- 边界情况:
width小于等于字符串长度,返回原字符串的拷贝(不填充)。- 确保
result以'\0'
- 可扩展性:
- 可以修改为原地填充(直接修改原字符串),但需要确保原字符串有足够空间(例如通过
strncat实现)。
- 可以修改为原地填充(直接修改原字符串),但需要确保原字符串有足够空间(例如通过
其他实现方式(原地填充)
如果允许修改原字符串,可以这样实现:
void padleft_inplace(char* str, int width, char pad_char) {
if (str == NULL) {
return;
}
size_t len = strlen(str);
if (len >= width) {
return;
}
int pad_len = width - len;
memmove(str + pad_len, str, len + 1); // +1 to include null terminator
memset(str, pad_char, pad_len);
}
int main() {
char str[] = "hello";
padleft_inplace(str, 10, '0');
printf("Padded: \"%s\"\n", str); // 输出: "00000hello"
return 0;
}
注意:这种方式会直接修改原字符串,且需要确保原字符串有足够空间(例如定义为 char str[20])。

(图片来源网络,侵删)
