Массив символов с указателем в c с%s

У меня есть эти два кода программирования C. Они идентичны, за исключением одного шага, и из-за этого их вывод совершенно другой, пожалуйста, помогите мне, почему это происходит

main()
{
char ch[10]="123456";
char *p;
int a;
scanf("%d",&a);
p=ch+a;
*p='0';
printf("%s",ch);
} 

output is 
nik@debian:~$ ./a.out 
4
123406

А вот другой имеет только небольшое изменение в строке [*p='0']

main()
{
char ch[10]="123456";
char *p;
int a;
scanf("%d",&a);
p=ch+a;
*p=0;        //only change is here rest is same
printf("%s",ch);
} 

and output is
nik@debian:~$ ./a.out 
4
1234

пожалуйста, помогите мне, почему это так важно, потому что я использую%s в printf или для чего-то другого, чего мне не хватало

2 ответа

Решение

Для простоты объяснения давайте рассмотрим, как мы придерживаемся значений ASCII.

В первом случае

 *p='0';

ставит значение ASCII '0' (десятичный48) в память, указанную p,

Во втором случае

*p = 0;

помещает значение ASCII 0 (десятичный0) сама в память указанная p,

Следовательно, в первом случае для строки, представленной в качестве аргумента %s значение по данному индексу (4) 48, который заставляет его печатать литерал 0 и продолжать до тех пор, пока не найдет нулевой терминатор.

Теперь, во втором случае, потому что ASCII 0 указывает нулевой символ в данном индексе, %s находит конец строки и останавливается там.

В первом фрагменте кода вы назначаете указатель char p на значение int, затем разыменовываете указатель и присваиваете его другому целому числу. Оператор разыменования назначает новое значение, строку, содержащую 0, '0', адресу памяти, который раньше занимал ch+a.

Во втором фрагменте кода адрес памяти в указателе присваивается целочисленное значение 0, а не строка "0".

Другие вопросы по тегам