32

假设我有一个char* str = "0123456789",我想剪掉第一个和最后三个字母,只打印中间,最简单、最安全的方法是什么?

现在的诀窍:要剪切的部分和要打印的部分大小不同,所以我可以有一个很长的 char* 或一个非常小的字符。

4

5 回答 5

64

您可以使用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 个右对齐字符。

于 2008-11-01T23:03:22.147 回答
9

罗伯特甘布尔和史蒂夫分别拥有大部分作品。组装成一个整体:

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);
于 2008-11-01T23:16:15.913 回答
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"
于 2008-11-01T23:03:41.197 回答
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当不再需要内存时,调用者可以 'd 调用返回的指针。本着 C 的精神,该函数不验证提供的起始位置和长度。

于 2008-11-03T01:32:49.817 回答
-2

我相信你可以用 printf 做一些魔法,它只会打印一定数量的字符,但它并不被普遍理解或使用。我们试图在以前的工作中做到这一点,但无法使其始终如一地工作。

我要做的是保存一个字符,将字符串中的该字符设为空,打印它,然后将其保存回来。

于 2008-11-01T23:05:12.177 回答