我找不到类似的答案。
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");
我不能使用任何其他功能。
答案 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“不能使用任何其他功能”......
查找有效的可索引内存buffer
和p2
的范围。 buffer
的有效可转换范围为0
到sizeof(buffer) - 1
。
p2
(字符串文字)的相同内容很复杂。如果p2
是典型的C字符串,则范围为0
到strlen(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";
buffer
和p2
完全相同。使用buffer
,您声明一个字符数组并将第一个字符指定为'a'
,然后使用显式空终止字符 '\0'
为您提供字符串{{1} }。使用"a"
,您可以为字符串文字p2
指定字符串文字,并将自动附加到结尾。无论哪种方式 - 你得到同样的东西,"a"
和buffer
持有字符串p2
。