比较指针(包括字符指针)的C语言操作

12

晚上好,我有两个函数,每个函数都接受一个 char 指针作为参数:

char pointer[255];
func1(char* pointer)
{
...
memcpy(pointer,some_char,strlen(something));
return;
}
func2(char* pointer)
{
...
if (pointer==someother_char) exit(0); //FAILs
//also I have
if(pointer==someother_pointer2char); // FAILs
}

现在我尝试了 strstr,strcmp,但它们都不起作用。想尝试使用 memcmp,但我没有静态长度。由于我需要比较 char* 和 char 以及 char* 和 char*,所以我需要两个解决方案,对吧?

那么,如何以最短的方式比较这些指针(实际上是指向的对象)?

谢谢。

编辑

感谢 wallacer 和 Code Monkey,现在对于 char* 到 char 的比较,我使用以下方式:

func1(char* ptr){
char someother_char[255];
char *ptr_char = NULL; //I have to strcmp a few values so this is why I initialize it first
... 
ptr_char = someother_char;
if (strcmp(ptr,ptr_char) == 0) //gtfo and it does...
...
ptr_char = some2nd;
if(strcmp...
任何建议可能会有所帮助...(嗯,用于比较的外部函数?) < p > < em >建议1(由Code Monkey提供)

#include <stdio.h>

int main(void) {
    char tempchar[255];
    tempchar[0] = 'a';
    tempchar[1] = 'b';
    tempchar[2] = '\0';
    char *ptr_char;
    ptr_char = &tempchar[0];
    printf("%s", ptr_char);
    return 0;
}

展示一下你如何尝试使用 strcmp - cnicutar
你使用了 strcmp() == 0 还是 !=0? - user195488
我已经尝试了strcmp() == 0,现在它可以工作了。唯一剩下的事情就是将char*的指针与someother_char[255]进行比较。 - cat9
你似乎是C语言和指针方面的新手。我建议你阅读comp.lang.c FAQ,特别是关于指针和数组的章节。http://c-faq.com/ - Jens
4个回答

22

您需要使用strcmp函数。如果不知道如何使用,以下是正确的使用方法:

char *someother_char = "a";
char *pointer = "a";

if (strcmp(pointer, someother_char) == 0) { // match!
}
else { // not matched 
}

要将其与char进行比较,您需要将其提升为char*

char *someother_char1;
char test = 'a';
char *pointer = "a";

strncpy((char*)test,someother_char1,sizeof(test));

if (strcmp(pointer, someother_char1) == 0) { // match!
}
else { // not matched 
}

如果您想使用char数组,则必须进行解引用:

char char_array[255];
// don't forget to fill your array
// and add a null-terminating char somewhere, such as char_array[255] = '\0';
char *ptr_somechar = &char_array[0];
char *pointer = "a";

if (strcmp(pointer, ptr_somechar) == 0) { // match!
} else { // not matched
}

只回答了我问题的一半...如何比较char*和char是个问题... - cat9
1
请注意,char *pointer = "a" 真的很邪恶,只允许用于向后兼容 C 的情况。strcmpconst char array[] = "a" 完全可以正常工作,而且我认为这是最清晰的形式。但至少不要使用 const - Voo
但这样的话,你就得不到指针了,而且你必须像 &array[0] 一样操作,对吧? - cat9
如果有人看到这个问题,避免丢失\0并使用char hax[255] = {0};是常识吗?这样做是否也会浪费内存? - cat9
@cat9:你可以预先用零填充数组。然而,我更喜欢确保空终止字符始终存在,否则可能会导致潜在的缓冲区溢出或漏洞。 - user195488
显示剩余3条评论

1

首先,如果你想比较指针所指向的内容,你需要对它们进行解引用。这意味着要比较实际的字符值,你需要调用

if (*pointer == someother_char)

然而,这只会比较数组中的第一个字符,这可能不是您想要做的。

要比较整个字符串,应该使用strcmp函数。

char* someother_str = "hello strstr";
if(strcmp(pointer, someother_str) == 0) {
    // do something
}

确保你的另一个字符串被声明为char*类型

更多信息:http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

编辑:根据您的评论。比较char*和char并没有太多意义。一个是字符值,另一个是内存中的地址。要这样做,您可以解引用char*或引用值变量。

char c;
char* ptr;

// dereference ptr
if ( c == *ptr ) {
   ...
}

// reference the value
if ( &c == ptr ) {

}

第一种方法检查值是否相同。第二种方法检查ptr是否实际上指向包含c的内存,即ptr是否是指向c的指针。
希望这有所帮助。

好的,这是我所想的,但那只是问题的一半。如果我必须比较char*和char怎么办?附言:幸好我记得如何进行解引用,只有第一个“字母”会被比较... - cat9
@cat9 将char*与char进行比较是没有意义的。实际上,它将始终失败,因为一个char通常是8位,而内存地址通常为32位或64位,具体取决于您的系统。char只能在0-255范围内,而内存地址占用了更大的数字范围。 - wallacer
使用我提供的strcmp解决方案。它会比较整个字符串。 - wallacer
如果你想要一个指向字符的指针,可以使用 char* ptr_somechar = &somechar; - wallacer
该死,somechar不是给出数组中第一个“字母”的地址吗?没问题,我会引用&somechar,只是问一下。我已经做到了没有引用&,所以我会报告是否按照我的方式工作。 - cat9
显示剩余3条评论

0

使用函数srtncmp而非srtcmp。

int res = strncmp(str, "¿Cuál es tu nombre? ", 100);

请查看下一个链接:

比较字符串


-1

字符串以空字符结尾。当您使用这种类型的字符串时,最好不要与其他内存复制函数混合使用。 一旦进行了memcpy操作,请注意您的目标字符串将不会以空字符结尾。 memcmp是一种快速操作。否则,您可以简单地循环遍历每个字符,并在找到差异时退出。 要使用strcmp,请确保两个字符串都以空字符结尾。否则会导致崩溃。

我建议您使用字符串函数如strcmp,strlen,strcpy来处理字符串,因为它们实际上已经被实现了。

除非两个指针引用同一内存位置,否则无法比较两个指针。指针只是指向内存位置的地址。您真正想做的是比较内容而不是比较存储位置的地址。所以请使用strcmp,但再次警告您确保它以空字符结尾。


就像我之前所说的那样...需要比较指针...请重新阅读整个线程,如果你有时间的话。谢谢。 - cat9
在我的理解中,您只需要检查缓冲区中的第一个字符。这可以通过访问pstr [0]或*pstr来完成,即如果(pstr [0] == 'Y')//退出 - sarat
看,这是不可能的,cat9,因为指针只包含一个位置值,而不是实际内容。你必须解除引用才能看到内容。当你将指针与任何东西进行比较时,你只是在比较内存地址。同时,使用*ptr将取消引用内存位置并获取该位置中的内容并进行比较。 例如: if( ptr == 'c' )// 错误 if( ptr == ptr1 ) // 内存位置比较。很少使用 if( *ptr == 'c' )// 正确取消引用指针并比较数据。 - sarat
如何取消引用并获取完整的数组(字符串)? - cat9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接