C 为什么我可以减去两个指针并使用结果作为大小?

C 为什么我可以减去两个指针并使用结果作为大小?,c,strncpy,C,Strncpy,在这个代码段中,strncpy的n值是两个字符指针的差值。如何减去两个字符串指针?这里n的值是多少 程序编译成功,但大小不一定是int值吗 void replace(char *s1) { char r[4][5] = { "get", "tell", "your", "house" }; char rep[4][10] = { "see", "us", "tall", "kite" }; char buff[500]; int i; char *ch;

在这个代码段中,strncpy的n值是两个字符指针的差值。如何减去两个字符串指针?这里n的值是多少

程序编译成功,但大小不一定是int值吗

void replace(char *s1) { 
    char r[4][5] = { "get", "tell", "your", "house" };
    char rep[4][10] = { "see", "us", "tall", "kite" };
    char buff[500];
    int i;
    char *ch;

    for (i < 0; i < 4; i++) { 
        if ((ch = strstr(s1, r[i]))) {
            strncpy(buff, s1, ch - s1);
            buff[ch-s1] = 0; 
            sprintf(buff + (ch - s1), "%s%s", rep[i], ch + strlen(r[i])); 
            s1[0] = 0; 
            strcpy(s1, buff);

            return replace(s1);
        }
    }
}

如果有两个指针p和q指向同一个数组,那么p-q的计算结果是数组中p和q之间的有符号元素数。例如,考虑这个代码:

int array[137];
int* p = &arr[10];
int* q = &arr[5];

ptrdiff_t diff = p - q;
这里,p指向数组的第十个元素,q指向数组的第五个元素,所以p-q是五。特殊类型ptrdiff_t是一个整数类型,它的大小足以容纳任意两个指针的差

另一种解释这种差异的方法是问“如果我们想象数组从q指向的地方开始,指针p指向什么索引?”在这种情况下,答案是5,因为如果我们将q作为数组的基,那么p将位于索引5。在您的例子中,指针ch被设置为等于strstr的返回值,因此它指向s1的中间。表达式ch-s1表示“字符串中ch指向的位置”


类比空间中的点:如果你有两个点p和q,你可以把p-q看作一个向量,表示从q到p的方向。但是,你不能有意义地将点p和q相加得到p+q,就像你不能在C中添加两个指针一样。

这个编码中没有n,har r[4][5]必须是char r[4][6],因为len of house是6,带有\0。你还从void函数返回了一些东西。你得到了多少警告?ch-s1是正确的。它是从s1开始到ch的子字符串的长度。编译器将它转换为strncpy的corect整数类型。它只是char*s1,我已经把房子改成了hour。但是我的疑问是strncpy中的大小怎么可能是两个char指针的差。char指针甚至可以被减去吗?谢谢你,先生。你能解释一下buf是什么吗[ch-s1]=0,sprintf语句和s1[0]=0在这个程序中的意思是。。?