Let's say I have a char* str = "0123456789"
and I want to cut the first and the last three letters and print just the middle, what is the simplest, and safest, way of doing it?
Now the trick: The portion to cut and the portion to print are of variable size, so I could have a very long char*, or a very small one.
char* means a pointer to a character. In C strings are an array of characters terminated by the null character.
You can use strncpy to duplicate the part of your string you want to print, but you'd have to take care to add a null terminator, as strncpy won't do that if it doesn't encounter one in the source string.
You can use printf()
, and a special format string:
char *str = "0123456789"; printf("%.6s\n", str + 1);
The precision in the %s
conversion specifier specifies the maximum number of characters to print. You can use a variable to specify the precision at runtime as well:
int length = 6; char *str = "0123456789"; printf("%.*s\n", length, str + 1);
In this example, the * is used to indicate that the next argument (length
) will contain the precision for the %s
conversion, the corresponding argument must be an int
.
Pointer arithmetic can be used to specify the starting position as I did above.
[EDIT]
One more point, if your string is shorter than your precision specifier, less characters will be printed, for example:
int length = 10; char *str = "0123456789"; printf("%.*s\n", length, str + 5);
Will print "56789
". If you always want to print a certain number of characters, specify both a minimum field width and a precision:
printf("%10.10s\n", str + 5);
or
printf("%*.*s\n", length, length, str + 5);
which will print:
" 56789"
You can use the minus sign to left-justify the output in the field:
printf("%-10.10s\n", str + 5);
Finally, the minimum field width and the precision can be different, i.e.
printf("%8.5s\n", str);
will print at most 5 characters right-justified in an 8 character field.
Robert Gamble and Steve separately have most of the pieces. Assembled into a whole:
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); }
Invocation for the example:
print_substring("0123456789", 1, 3);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With