带有 %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'。
我有这两个 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'。