2012-04-15 4 views
0

Я ищу какой-то существующий код и добавил несколько строк printf. Там есть строка ф «TZ = тест»Установка строки в ' 0'

cp = strchr(str, '='); 
printf("Text: %s\n",cp); 
printf("Text cp+1: %s\n",cp+1); 
*cp = '\0'; 
printf("Text: %s\n",cp); 
printf("Text cp+1: %s\n",cp+1); 

выход:

Text: =test 
Text c+1: test 
Text: 
Text c+1: test 

Я понимаю, первые два теста, но почему четвертая печать «тест», даже если * ф был установлен '\ 0' прямо перед этим?

+0

Что вы ожидали отпечатка? –

ответ

3

В отличие от некоторых других языков, C не знает, что такое строка, она знает только, где она заканчивается, поэтому печатает из указателя, который вы ему даете.

[=test\0] 
1: ^start here 
     ^end at \0 
2: ^start here 
     ^end at \0 

    [\0test\0] 
3: ^start here, it's \0, so stop 
4:  ^start here 
     ^end at \0 
2

Потому что вы печатаете * cp + 1.

Вот что сП выглядел как прежде:

= тест
^^^^^^^^

и вот после того, как

  тест
^^^^^^^^

Вы только переписывали первый символ.

2

Это не имеет значения, установлен ли cp[0] к '\ 0'. Вы печатаете cp+1, который по-прежнему «проверяет».

2

Потому что вы устанавливаете только первый символ строки в \0. Остальная часть памяти не тронута. Поэтому печать с *cp + 1 начинается с Test, а не от \0Test.

2

Установка символа в \0 прервет строку перед ним в данный момент, так как \0 является строка символ конца в С.

Все после этого не зависит от него, так что это отличный способ, чтобы избежать распределения больше памяти при разделении строки, поскольку вы можете просто заменить разделитель на \0, а затем использовать исходный указатель на начало строки, чтобы получить первую часть, и sep + 1, чтобы получить вторую часть.

Смежные вопросы