[英]Compare string literal vs char array
我找不到類似的答案。
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");
我不能使用任何其他功能。
在許多情況下,數組(或字符串)都將轉換為它們的第一個元素的地址。
在您的代碼中,在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“不能使用任何其他功能” ...
查找有效的可索引內存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中的函數,而是運算符。
如果您不認識它:
char buffer[] = {'a', '\0'};
char p2[] = "a";
buffer
和p2
完全相同 。 使用buffer
您可以聲明一個字符數組,並將第一個字符分配為'a'
,然后將一個明確的以零結尾的字符 '\\0'
分配給您一個字符串"a"
。 使用p2
您可以分配字符串文字"a"
並且以null結尾的字符會自動附加到末尾。 無論哪種方式,您都會得到相同的結果, buffer
和p2
包含字符串"a"
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.