假设我有一个
现在的关键是:要剪切的部分和要打印的部分大小是可变的,因此我可能会有一个非常长的char*,或者一个很小的。
char* str = "0123456789"
,我想剪去前三个和后三个字母,只打印中间的部分,最简单且最安全的方法是什么?现在的关键是:要剪切的部分和要打印的部分大小是可变的,因此我可能会有一个非常长的char*,或者一个很小的。
char* str = "0123456789"
,我想剪去前三个和后三个字母,只打印中间的部分,最简单且最安全的方法是什么?printf()
函数,并搭配一个特殊的格式字符串:char *str = "0123456789";
printf("%.6s\n", str + 1);
%s
的精度转换说明符指定要打印的最大字符数。您还可以在运行时使用变量来指定精度:int length = 6;
char *str = "0123456789";
printf("%.*s\n", length, str + 1);
length
)将包含%s
转换的精度,相应的参数必须是int
。int length = 10;
char *str = "0123456789";
printf("%.*s\n", length, str + 5);
将会打印出 "56789
"。如果你想总是打印一定数量的字符,那么需要同时指定最小字段宽度和精度:
printf("%10.10s\n", str + 5);
printf("%*.*s\n", length, length, str + 5);
将打印:
" 56789"
printf("%-10.10s\n", str + 5);
最后,最小字段宽度和精度可以不同,即
printf("%8.5s\n", str);
该代码将在8个字符的字段中右对齐打印最多5个字符。
Robert Gamble和Steve各自拥有大部分的组件。 将它们组装成一个整体:
void print_substring(const char *str, int skip, int tail)
{
int len = strlen(str);
assert(skip >= 0);
assert(tail >= 0 && tail < len);
assert(len > skip + tail);
printf("%.*s", len - skip - tail, str + skip);
}
示例的调用方法:
print_substring("0123456789", 1, 3);
如果您不介意修改数据,您可以进行一些指针算术运算。这是假设str是一个char指针而不是数组的情况:
char string[] = "0123456789";
char *str = string;
str += 3; // "removes" the first 3 items
str[4] = '\0'; // sets the 5th item to NULL, effectively truncating the string
printf(str); // prints "3456"
这里有一个干净简单的子字符串函数,我从我的个人库中挖掘出来,可能会很有用:
char *
substr(const char *src, size_t start, size_t len)
{
char *dest = malloc(len+1);
if (dest) {
memcpy(dest, src+start, len);
dest[len] = '\0';
}
return dest;
}
这个函数很可能是不言自明的,它接受一个字符串、一个起始位置(从零开始)和一个长度,并返回原始字符串的子串或空指针(如果 malloc 失败)。当内存不再需要时,调用者可以使用 free
释放返回的指针。为了符合 C 的精神,该函数不验证提供的起始位置和长度。
我相信printf有一些神奇的技巧,可以仅打印特定数量的字符,但这不是常见的理解或使用方式。我们曾尝试在之前的工作中实现它,但无法始终使其正常工作。
我的做法是先保存一个字符,在字符串中将其清空,打印后再重新保存回来。
printf("%.2d", 123);
只打印23
或printf("%-.2d", 123);
只打印12
?:-|
- Synetech