def join_strings(strings, join_char="_"):
    """Join list of strings with an underscore.

    The strings must contain string.printable characters only, otherwise an exception is raised.
    If one of the strings has already an underscore, it will be replace by a null character.

    Args:
        strings: iterable of strings.
        join_char: str, the character to join with.

    Returns:
        The joined string with an underscore character.

    Examples:
    ```python
        >>> join_strings(['asd', '', '_xcv__'])
        'asd__\x00xcv\x00\x00'
    ```

    Raises:
        ValueError if a string contains an unprintable character.
    """
    all_cleaned = []
    for s in strings:
        if not s.isprintable():
            raise ValueError("Encountered unexpected name containing non-printable characters.")
        all_cleaned.append(s.replace(join_char, "\0"))
    return join_char.join(all_cleaned)