我有这两个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或者其他我失踪的东西
答案 0 :(得分:2)
为了便于解释,请考虑我们一直坚持ASCII values。
在第一种情况下,
*p='0';
将'0'
(十进制48
)的ASCII值放入p
指向的内存中。
在第二种情况下,
*p = 0;
将ASCII值0
( decimal 0
)本身放入p
指向的内存中。
因此,在第一种情况下,对于作为%s
的参数提供的字符串,给定索引(4)处的值为48
,这使得 print 文字0并继续,直到找到一个空终止符。
现在,在第二种情况下,因为ASCII 0
表示该给定索引处的空字符,%s
找到字符串的结尾并停在那里。
答案 1 :(得分:0)
在第一段代码中,将char指针p指定给int值,然后取消引用指针并将其指定给另一个整数。解除引用运算符将新值(包含0,' 0')的字符串分配给以前由ch + a占用的存储器地址。
在第二段代码中,指针的存储器地址被赋值为整数值0,而不是字符串' 0'。