How can I print a non-null-terminated string using printf, assuming that I know the length of the string at runtime?
问题:
回答1:
printf("%.*s", length, string); Use together with other args:
printf("integer=%d, string=%.*s, number=%f", integer, length, string, number); // ^^^^ ^^^^^^^^^^^^^^ In C you could specify the maximum length to output with the %.123s format. This means the output length is at most 123 chars. The 123 could be replaced by *, so that the length will be taken from the argument of printf instead of hard-coded.
Note that this assumes the string does not contain any interior null bytes (\0), as %.123s only constrains the maximum length not the exact length, and strings are still treated as null-terminated.
If you want to print a non-null-terminated string with interior null, you cannot use a single printf. Use fwrite instead:
fwrite(string, 1, length, stdout); See @M.S.Dousti's answer for detailed explanation.
回答2:
The answer provided by @KennyTM is great, but with a subtlety.
In general, if the string is non-null "terminated", but has a null character in the middle, printf("%.*s", length, string); does not work as expected. This is because the %.*s format string asks printf to print a maximum of length characters, not exactly length characters.
I'd rather use the more general solution pointed out by @William Pursell in a comment under the OP:
fwrite(string, sizeof(char), length, stdout); Here's a sample code:
#include int main(void) { size_t length = 5; char string[length]; string[0] = 'A'; string[1] = 'B'; string[2] = 0; // null character in the middle string[3] = 'C'; string[4] = 'D'; printf("With printf: %.*s\n", length, string); printf("With fwrite: "); fwrite(string, sizeof(char), length, stdout); printf("\n"); return 0; } Output:
With printf: AB With fwrite: AB CD