假设我有 char * str =" 0123456789" ,我想剪切第一个和最后三个字母并打印中间,最简单,最安全的方式做到了吗?

现在的诀窍:要切割的部分和要打印的部分是可变大小的,所以我可以有一个非常长的char *,或者非常小的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个右对齐的字符。

其他提示

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

如果你不介意修改数据,你可以做一些指针算术。这假设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 。本着C的精神,该功能不会验证所提供的起始位置和长度。

我相信你可以用printf做一些魔法,它只会打印一定数量的字符,但是它并不常用,也不常用。我们试图在以前的工作中做到这一点,但无法让它始终如一地工作。

我要做的是保存一个字符,将字符串中的字符置空,打印出来,然后保存回来。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top