Массив символов с указателем в 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".