2

我有这两个 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 或其他我一直缺少的东西

4

2 回答 2

2

为了便于解释,让我们考虑一下我们始终坚持使用ASCII 值

在第一种情况下,

 *p='0';

'0'( decimal48 ) 的 ASCII 值放入p.

在第二种情况下,

*p = 0;

将 ASCII 值0十进制0)本身放入p.

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

现在,在第二种情况下,因为 ASCII0指示该给定索引处的空字符,所以%s找到字符串的结尾并停在那里。

于 2016-09-10T14:30:35.703 回答
0

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

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

于 2016-09-10T14:34:32.107 回答