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

时间:2016-09-10 14:23:11

标签: 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]="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或者其他我失踪的东西

2 个答案:

答案 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'。