给定c中的char[]
,我想从printf
中的某个位置开始指定该数组的输出长度,我该如何方便地做到这一点?
例如,我想打印从位置3(从0开始索引)到位置8的部分:
printf("%s", char_array+3..char_array+8)
我可以制作一个具有所需长度的临时char [],但这不是很方便。或者我可以写一个子字符串函数
char* substring(const char* str, size_t begin, size_t len) {
if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin + len))
return 0;
return strndup(str + begin, len);
}
但如果我打电话
printf("%s", substring(s, 3, 5));
恐怕会有内存泄漏。
您如何看待最佳方法?
答案 0 :(得分:7)
#include <stdio.h>
int printmid(const char *data, size_t start, int len) {
return printf("%.*s", len, data + start);
}
int main(void) {
char data[] = "Hello, World!";
printmid(data, 3, 6);
puts("");
return 0;
}
输出
lo, Wo
答案 1 :(得分:1)
int end = 8;
int bgn = 3;
int len = end - bgn + 1;
printf("%*.*s", len, len, char_array + bgn);
请注意,len
应为int
(例如,不是两个指针之间的差异 - 即ptrdiff_t
或size_t
)。如果需要,也可以省略第一个长度 - 两个都可以指定,如果源字符串短于指定长度(意味着在char_array + end
之前字符串中有空字节),它们具有特定含义。显然,如果char_array
中的字符串短于4个字节,则终止空值后面的内容可能是垃圾,并且GIGO适用。如果您不确定该字符串的长度是否至少为8个字节,您可能希望输出左对齐,在这种情况下,在第一个-
之前插入减号*
;如上所述,较短的字符串将是正确的。