Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中指针为%s的字符数组_C_Arrays_String_Pointers_Null Character - Fatal编程技术网

c中指针为%s的字符数组

c中指针为%s的字符数组,c,arrays,string,pointers,null-character,C,Arrays,String,Pointers,Null Character,我有这两个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]="1234

我有这两个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
请给我解释为什么它是不同的,这是因为我在Prtff中使用%s,或者因为我已经丢失的其他东西

为了便于解释,让我们考虑我们坚持到底。< /P> 在第一种情况下

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

在第二种情况下

*p = 0;
将ASCII值
0
(十进制
0
)本身放入
p
指向的内存中

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


现在,在第二种情况下,由于ASCII
0
指示给定索引处的空字符,
%s
找到字符串的结尾并在那里停止。

在第一段代码中,您将字符指针p分配给int值,然后取消引用指针并将其分配给另一个整数。解引用运算符将新值(包含0“0”的字符串)分配给以前由ch+a占用的内存地址


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

'0'
!=<代码>0。注:
p=ch+a可能会调用UB。让我们想象一下,我们输入值<数组中元素的数量一段时间以来,在低级别编码中没有细微的变化。因为,每一点都很重要,它可以表示“是”或“否”。