假设我有一个char* str = "0123456789"
我希望剪切第一个和最后三个字母并打印中间,这是最简单,最安全的方法吗?
现在的诀窍:要切割的部分和要打印的部分大小可变,所以我可以有一个非常长的char *或非常小的char *。
答案 0 :(得分:58)
您可以使用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
。< / p>
指针算术可用于指定起始位置,如上所述。
<强> [编辑] 强>
还有一点,如果您的字符串比您的精确说明符短,则会打印更少的字符,例如:
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个右对齐的字符。
答案 1 :(得分:9)
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);
答案 2 :(得分:1)
如果你不介意修改数据,你可以做一些指针算术。这假设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"
答案 3 :(得分:0)
这是一个干净简单的子字符串函数,我从我的个人库中挖掘出来可能很有用:
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的精神,该功能不会验证所提供的起始位置和长度。
答案 4 :(得分:-2)
我相信你可以用printf做一些魔法,它只会打印一定数量的字符,但是它并不常用,也不常用。我们试图在以前的工作中做到这一点,但无法让它始终如一地工作。
我要做的是保存一个字符,将字符串中的字符置空,打印出来,然后保存回来。