为什么memcpy返回的字符串永远不等于数组中存在的相同字符串?

时间:2018-07-03 04:36:31

标签: c arrays memcpy

我正在使用简单的字符串匹配和搜索。 尽管*arr的值(为什么我)相同,但为什么它们从不等于point?我很困惑是什么原因造成的吗?它与字符串有关还是有其他原因?任何帮助,将不胜感激。如果问题不清楚,对不起。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int search(char ** arr, int size, char *point);

int main()
{
    char *array[5]={0};
    char original[50];
    char toSearch[50];
    char *point;     
    int size=5,  searchIndex,i;

    /* Copy a string into the original array */
    strcpy(original, "why this is not equal");

    /* Copy the first 10 characters of the original array into the newcopy    array*/
    point = memcpy(toSearch, original, 10);

    /*string to search*/     
    array[2]="why this i";

    searchIndex = search(array, size, point);

    if(searchIndex == -1)
    {
        printf("%s does not exists in array \n", point);
    } else
    printf("%s is found at %d position.", toSearch, searchIndex + 1);

    return 0;
}

int search(char ** arr, int size, char *point)
{
    int index = 0;
    // Pointer to last array element arr[size - 1]
    char ** arrEnd = (arr + size - 1);

    /* Why *arr!=point is never false,
       even when both are giving out same values (why this I)?
    */
    while(arr <= arrEnd && *arr!=point)
    {
        printf("%s == %s", *arr,point);
        arr++;
        index++;
    }

    if(arr <= arrEnd)
    {
        printf("%s after found \n",*arr);
        return index;
    }

    return -1;
}

输出:

(null) == why this i 
(null) == why this i   
why this i == why this i  
(null) == why this i   
(null) == why this i 
why this i does not exists in array

谢谢

2 个答案:

答案 0 :(得分:2)

我假设您是在问为什么数组类型为char的变量的地址与您复制到它的字符串文字的地址不同。

这是一个棘手的问题,因为,请原谅我这么说,目前尚不清楚是什么使您期望复制任何变量后地址会有所不同。

请考虑以下示例:用相同的字符串文字填充两个不同的char数组。

char toSearch1[50];
char toSearch2[50];
char *point1;
char *point2;

point1 = memcpy(toSearch1, original, 10);
point2 = memcpy(toSearch2, original, 10);
/* or, depending on what to you is more convincingly copying the same literal */
point2 = memcpy(toSearch2, toSearch1, 10);

然后,两个数组仍然是array-of-char类型的两个不同变量,并且memcpy返回目标地址,即两个不同数组的地址。
请想象一下,这两个数组现在如何具有相同的地址。

如果您跟进

strcpy(original1, "is this in one or both arrays?");

然后您会期望两个数组再次具有不同的地址吗?

如果这不能回答您的问题,那么您对变量的指针和地址的理解与大多数程序员完全不同,我建议通过查找有关指针和地址的教程来进行修改。

(注意,关于您要问的问题的解释,我跳过了与数组大小相关的检查长度的讨论,而是使用更安全的字符串复制版本,memcpy不能正确地使终止复制的字符串为null。但是,所有这些都很重要来制作可靠的代码,例如Lundin正确地提醒了我们。)

答案 1 :(得分:1)

在C中,字符串只是以null结尾的char数组。作为普通数组,当直接在表达式中使用时,它们会衰减为指针。因此,当您编写DirectoryInfo[] dirs = dir.GetDirectories(); 时,您只是在将指针与其第一个元素进行比较。

只有两个指针指向相同的对象(相同的地址),它们才相等。这就是为什么标准库提供str1 == str2来比较以空终止的字符串,而strcmp来比较已知大小的任意缓冲区的原因。