我正在使用简单的字符串匹配和搜索。
尽管*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
谢谢
答案 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
来比较已知大小的任意缓冲区的原因。