如何指定要在printf中打印出来的char []的长度

时间:2012-01-07 20:02:50

标签: c

给定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));

恐怕会有内存泄漏。

您如何看待最佳方法?

2 个答案:

答案 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_tsize_t)。如果需要,也可以省略第一个长度 - 两个都可以指定,如果源字符串短于指定长度(意味着在char_array + end之前字符串中有空字节),它们具有特定含义。显然,如果char_array中的字符串短于4个字节,则终止空值后面的内容可能是垃圾,并且GIGO适用。如果您不确定该字符串的长度是否至少为8个字节,您可能希望输出左对齐,在这种情况下,在第一个-之前插入减号*;如上所述,较短的字符串将是正确的。