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

时间:2014-08-27 13:24:35

标签: c

我找不到类似的答案。

  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");

我不能使用任何其他功能。

3 个答案:

答案 0 :(得分:1)

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

在您的代码中,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);

答案 1 :(得分:1)

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“不能使用任何其他功能”......

查找有效的可索引内存bufferp2的范围。 buffer的有效可转换范围为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<buffer_size; i++) {
   if (buffer[i] != p2[i]) return NOT_EQUAL;
 }
 return EQUAL;

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

答案 2 :(得分:0)

如果你不认识它:

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

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