在C中打印char 的一部分的最简单方法

假设我有一个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的精神,该function不会validation提供的起始位置和长度。

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

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