比较字符串文字与字符数组

我找不到类似的答案。

char buffer[] = {'a', '0'}; char p2[] = "a"; printf("%d", buffer==p2); // prints 0 

我该如何进行这种比较? 这是一个类似的问题吗? 如何将字符串文字与char数组进行比较。

 char buffer[] = {'a', '0'}; printf("%d", buffer=="a"); // prints 0 

以上只是示例,但我真的需要这个:

  char buffer[] = {'e','a','b','g','e','l','e','g','o','n','\000','p','k','n','m','l','\000','j', 'i', 'h'}; printf("%d", buffer=="eabgelegon\000pknml\000jih"); 

我不能使用任何其他function。

许多环境中的数组(或字符串)将转换为其第一个元素的地址。

在您的代码中,在printf()内部,正在比较这些地址。

要比较地址指向的东西,你需要strcmp() (对于真正的字符串)或memcmp() (对于二进制数据)

 char buffer[] = {'e','a','b','g','e','l','e','g','o','n','\000','p','k','n','m','l','\000','j', 'i', 'h'}; int equal1 = memcmp(buffer, "eabgelegon\000pknml\000jih", 20); printf("%d", equal1); int equal2 = memcmp(buffer, "eabgelegon\000XXXXXXXXX", 20); printf("%d", equal2); int equal3 = strcmp(buffer, "eabgelegon\000pknml\000jih"); printf("%d", equal3); int equal4 = strcmp(buffer, "eabgelegon\000XXXXXXXXX"); printf("%d", equal4); 

OP 3的buffer中没有一个最好被描述为C字符串。 简单的char数组。

 char buffer[] = {'a', '0'}; // No terminating \0 char buffer[] = {'a', '0'}; // No terminating \0 // No terminating \0 yet has embedded \0 char buffer[] = {'e','a','b','g','e','l','e','g','o','n','\000','p','k','n','m','l','\000','j', 'i', 'h'}; 

由于OP“不能使用任何其他function”……

查找有效的可索引内存bufferp2buffer的有效可索引范围是0sizeof(buffer) - 1

p2 (字符串文字)的相同内容很复杂。 如果p2是典型的C字符串,则范围是0strlen(p2) + 1 。 但是字符串文字如"eabgelegon\000pknml\000jih"中嵌入了'\0' (以及终止'\0' ),因此无法在运行时使用strlen()确定其范围,但仅限于使用sizeof()编译时间。

让我们假设比较不应该包括字符串文字的终止'\0'

  char buffer[] = 'e','a','b','g','e','l','e','g','o','n','\000','p','k','n','m','l','\000','j', 'i', 'h'}; char p2[] = "eabgelegon\000pknml\000jih"; // matches //char p2[] = "eabgelegon\000pknml\000ji "; // fails //char p2[] = "eabgelegon\000pk ml\000jih"; // fails size_t buffer_size = sizeof(buffer); size_t p2_size = sizeof(p2); // p2 should be 1 longer than buffer due to its terminating \0 if (buffer_size + 1 != p2_size) return NOT_EQUAL; size_t i; for (i=0; i 

注意: sizeof()不是C中的函数,而是运算符。

如果你不认识它:

 char buffer[] = {'a', '\0'}; char p2[] = "a"; 

bufferp2 完全相同 。 使用buffer您声明一个字符数组,并将第一个字符指定为'a' ,然后将显式的空终止字符 '\0'给您一个字符串"a" 。 使用p2您可以分配字符串文字"a" ,并且空终止字符会自动附加到末尾。 无论哪种方式 – 你得到相同的东西, bufferp2持有字符串"a"