带有 %s 的 c 中带有指针的 char 数组

char array with pointer in c with %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

请告诉我为什么它是不同的,因为我在 printf 中使用 %s 或其他我遗漏的东西

为了便于解释,假设我们一直坚持 ASCII values

第一种情况,

 *p='0';

'0'的ASCII值(十进制48)放入p指向的内存中。

在第二种情况下,

*p = 0;

将ASCII值0十进制0)本身放入p指向的内存中。

因此,在第一种情况下,对于作为参数提供给 %s 的字符串,给定索引 (4) 处的值是 48,这使得它成为 print 文字 0 并继续,直到找到空终止符。

现在,在第二种情况下,因为 ASCII 0 指示给定索引处的空字符,%s 找到 字符串的末尾 到此为止。

在第一段代码中,您将一个 char 指针 p 分配给一个 int 值,然后取消对该指针的引用并将其分配给另一个整数。解引用运算符将​​新值,即包含0的字符串'0'赋值给ch+a之前占用的内存地址。

在第二段代码中,指针处的内存地址被分配给一个整数值0,而不是字符串'0'。