假设我有一个char* str = "0123456789"
,我想剪掉第一个和最后三个字母,只打印中间,最简单、最安全的方法是什么?
现在的诀窍:要剪切的部分和要打印的部分大小不同,所以我可以有一个很长的 char* 或一个非常小的字符。
假设我有一个char* str = "0123456789"
,我想剪掉第一个和最后三个字母,只打印中间,最简单、最安全的方法是什么?
现在的诀窍:要剪切的部分和要打印的部分大小不同,所以我可以有一个很长的 char* 或一个非常小的字符。
您可以使用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 个右对齐字符。
罗伯特甘布尔和史蒂夫分别拥有大部分作品。组装成一个整体:
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
当不再需要内存时,调用者可以 'd 调用返回的指针。本着 C 的精神,该函数不验证提供的起始位置和长度。
我相信你可以用 printf 做一些魔法,它只会打印一定数量的字符,但它并不被普遍理解或使用。我们试图在以前的工作中做到这一点,但无法使其始终如一地工作。
我要做的是保存一个字符,将字符串中的该字符设为空,打印它,然后将其保存回来。