【问题标题】:Subtracting two strings in C在C中减去两个字符串
【发布时间】:2013-09-06 13:32:41
【问题描述】:

好吧,我实际上是在看 strcmp() ,对它的工作感到困惑。不管怎样,我写了这段代码

#include <stdio.h>

main()
{
    char a[5] = "ggod";
    char b[5] = "ggod";

    int c = 0;

    c = b - a;

    printf("%d value", c);
}

我得到的输出为

16

谁能解释为什么是16

【问题讨论】:

标签: c arrays string character-arrays


【解决方案1】:

你减去的不是两个字符串,而是两个char *c 保存ab 之间的内存地址差异。这几乎可以是任意的。在这里,它只是意味着您在堆栈中第一个字符串的开头和第二个字符串的开头之间有 16 个字节的空间。

【讨论】:

  • b - a的类型是ptrdiff_t,保证是有符号的int。当您将有符号的 int 分配给有符号的 int 变量时,C 编译器通常不会给出警告。
  • @Lundin 不,他们不这样做,但是当多个指针值出现在同一个算术表达式中时,他们通常会这样做。
  • 是的,你完全正确。只是忘记了 C 是如何工作的!基础不是它..应该问:P
  • 我不相信我见过编译器为此发出警告。 gcc -std=c99 -pedantic -Wall -Wextra 没有给出此代码的错误。
【解决方案2】:
  c = b - a;

这是指针运算。数组名它自己指向数组的起始地址。 c 保存ba 指向的两个位置之间的差异。 当您使用 %p 打印这些值时,您将了解您的情况
如果你打印的值看起来像这样 a==0x7fff042f3710 b==0x7fff042f3720

c= b-a ==>c=0x7fff042f3720-0x7fff042f3710=>c=0x10 //indecimal the value is 16

尝试打印那些

 printf("%p %p\n",a,b);
        c=b-a;    

如果你改变数组的大小差异就会改变

    char a[120]="ggod";
    char b[5]="ggod";

【讨论】:

  • 需要注意的是,减去指向不包含在一个数组中的两个对象的指针不具有 C 标准定义的行为。
【解决方案3】:

b 是一个数组对象

a也是一个数组对象

数组对象是数组的静态地址。

所以b-a 是两个地址之间的差异,而不是两个字符串之间的差异"ggod"-"ggod"

如果你想比较两个字符串,你可以使用strcmp()

strcmp() 如果两个字符串相同则返回 0,如果两个字符串不同则返回非 0 值

这里有一个使用strcmp()的例子

【讨论】:

  • 你所说的地址是正确的,但 C 没有对象!可能是一个错误的术语,使用指针或引用
猜你喜欢
  • 2013-10-25
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多