84

How can I print a non-null-terminated string using printf, assuming that I know the length of the string at runtime?

3
  • 6
    If it's not null terminated, then by definition it's not a string. Commented Aug 4, 2014 at 3:36
  • 9
    it's only not a c string, as it would be a valid string in other languages.. and though a "non-null-terminated array of char" would be more accurate, I'm pretty sure it was universally understood. Commented Jul 29, 2016 at 19:58
  • 2
    Possible duplicate of Using printf with a non-null terminated string Commented Apr 1, 2017 at 19:06

2 Answers 2

134
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.

Sign up to request clarification or add additional context in comments.

1 Comment

note: length must have type int here, after default argument promotions. If your length variable is something bigger (e.g. size_t) you should cast it to (int) else your code will break on a platform where size_t is wider than int.
25

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 <stdio.h>

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

4 Comments

sizeof (char) is 1 by definition. Also, NULL is specifically a null pointer constant.
@KeithThompson, sizeof (char) is more semantic. Also, '\0' is more semantic than 0. But who cares ;-)
My output for this is With fwrite: AB - it seems to be stopping at the null terminator. Compiled with gcc 4.8.5
@MatthewMoisen: See Godbolt output for your compiler.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.