Same length, different string Challenge

Given a non-empty string S of length L consisting entirely of printable ASCII chars, output another string of length L that consists entirely of printable ASCII chars, but is not equal to S.

For the purposes of this challenge, a printable ASCII char is one between U+0020 and U+007E, inclusive; that is, from   (space) to ~ (tilde). Newlines and tabs are not included.

For example, given "abcde", some valid outputs could be:


"11111"
"abcdf"
"edcba"


But these would be invalid:


"abcde"
"bcde"
"abcde0"


Test cases

"asdf"
"1111"
"       "
"~~~~~"
"abcba"
"1"
" "
"~"
" ~"
"~ "
"  0"
"!@#$%^&amp;*()ABCDEFGhijklmnop1234567890"
" !\"#$%&amp;'()*+,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"


Rules


You may assume the input consists entirely of printable ASCII chars.
You may not assume that the input does not contain all 95 printable chars.
You may assume the input contains at least one character and is less than 256 chars long.
The output must also consist entirely of printable ASCII chars. You could not, for example, output the byte \x7F for input "~".
The output must be different than the input with probability 1; that is, you may generate random strings until one is different than the input, but you can't just output L random characters and hope it's different.
Newlines are disallowed in the output, but you may output one trailing newline which is not counted toward the string.


Scoring

This is code-golf, so the shortest code in bytes in each language wins.
Python 2, 21 bytes

lambda s:`s`[:len(s)]


Try it online!

Takes the string representation of the input string and truncates it to the length of the input string. For a typical string, this puts it in ' quotes and chops off the end:

abc  -&gt;   'abc'  -&gt;  'ab
     rep        chop


Note that the new string starts with '. Let's show that the output always differs from the input.


If the input has no ', then the output starts with ' and the input does not. 
If the input contains a ' and but no ", then Python will use " for the outer quotes, giving a first character " that's not in the input string.
If the input has both ' and ", then the outer quotes are ' and each ' is escaped as \'. Wherever the first " appears in the input, it's shifted right by the initial ' in the output and by any possible escaping. This means it cannot match with a " in the corresponding position in the output.


Finally, note that quoting the input and possibly escaping characters always increases the number of characters, so truncating the output makes it the same length as the input.

Note that it was crucial that Python adaptively switches to " in the second case. If it didn't do so, it would fail on the three-character input '\'. Or, any longer prefix of the fix show string using '. So, this method won't work for most languages.