【问题标题】:char array with pointer in c with %sc 中带有指针的 char 数组,带有 %s
【发布时间】:2016-09-10 14:23:11
【问题描述】:

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

【问题讨论】:

  • 注意:p=ch+a; 可能会调用 UB,如果输入的数字使指针指向数组之外。
  • 假设我们暂时输入值
  • 底层编码没有细微的变化。因为,每一点都很重要,它可能意味着“是”或“不是”。

标签: c arrays string pointers null-character


【解决方案1】:

为了便于解释,让我们考虑一下我们一直坚持使用ASCII values

在第一种情况下,

 *p='0';

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

第二种情况,

*p = 0;

将ASCII值0十进制0)本身放入p指向的内存中。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      相关资源
      最近更新 更多