【问题标题】:C comparing pointers (with chars)C比较指针(带字符)
【发布时间】:2023-09-19 01:31:02
【问题描述】:

晚上好,我有 2 个函数,每个函数都接受一个指向 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 但我没有静态 len。因为我必须将 char* 与 charchar* 与 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...

可能有任何建议...(用于比较的外部函数?)

建议 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
  • 您使用的是 strcmp() == 0 还是 !=0?
  • 我已经尝试过 strcmp() == 0,现在它可以工作了。剩下的就是比较 char* 的指针和 someother_char[255];
  • 您似乎对 C 和指针不熟悉。我可以建议阅读 comp.lang.c 常见问题解答,尤其是关于指针和数组的章节吗? c-faq.com

标签: c string pointers compare


【解决方案1】:

您需要使用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 是个问题...
  • 现在很有趣,我已经尝试了这个字符 ptr = NULL 然后在代码中 ptr = &someother_char;这给 char* 提供了错误 char()[255]。无论如何,它现在正在工作(没有引用......仍在测试以响应上面的 wallacer)但这是一个性感的答案 Code Monkey
  • @cat9: 哎呀,它实际上是&amp;char_array[0],你不需要将它设置为null。有关示例程序,请参见此处:ideone.com/O4bKt
  • @cat9:如果这是帮助您解决问题的方法,请不要忘记单击我的答案旁边的接受复选标记。
  • 请注意,char *pointer = "a" 确实是邪恶的,并且只允许向后比较 C 的原因。strcmp 与const char array[] = "a" 完美配合,这是 imo 最清晰的形式。但至少不要使用const
【解决方案2】:

马上开始,如果你想比较指针,你需要取消引用它们。这意味着要比较实际的 char 值,您必须调用

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* 或引用 value 变量。

char c;
char* ptr;

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

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

}

第一种方法检查值是否相同。第二个检查是否 ptr 实际上指向包含 c ie 的内存。 ptr 是指向 c 的指针吗

希望有帮助

【讨论】:

  • 好的,这就是我的想法,但这只是问题的一半。如果我必须比较 char* 和 char 怎么办? PS 幸好我记得取消引用是如何工作的,并且只会比较第一个“字母”......
  • 以上仍然成立...我想将 char* 的指针与其他一些 char 进行比较。您的代码是正确的,但不是答案,因为我只会比较第一个“字母”。
  • @cat9 将 char* 与 char 进行比较是没有意义的。事实上,我认为它总是会失败,因为 char 通常是 8 位,而内存地址通常是 32 位或 64 位,具体取决于您的系统。 char 只能在 0 - 255 范围内,而内存地址占用的数字范围要大得多
  • 使用我提供的 strcmp 解决方案。它比较整个字符串
  • char* ptr = "omg"; char somechar[4] = "天哪"; strcmp(ptr,somechar)?这甚至会编译吗?我可以使用 char *ptr_somechar = somechar 然后继续使用 strcmp 吗?
【解决方案3】:

使用函数 srtncmp 没有 srtcmp。

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

查看下一个链接

compare strings

【讨论】:

    【解决方案4】:

    字符串以空值结尾。当您使用此类字符串时,与其他内存复制功能混合并不是一个好主意。 执行 memcpy 操作后,请注意您的目标字符串不会以空值结尾。 memcmp 是一种快速操作。否则你可以简单地遍历每个字符并在发现差异时退出。 要使用 strcmp,请确保两个字符串都以 null 结尾。否则会导致一些崩溃。

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

    你不能比较两个指针,除非两个指针都指向同一个内存位置。指针只是指向内存位置的地址。你真正想做的是,比较内容而不是比较存储它的地址。所以请使用 strcmp 但我再次警告你确保它是空终止的。

    【讨论】:

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