簡體   English   中英

比較字符串文字和字符數組

[英]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的有效可索引范圍是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中的函數,而是運算符。

如果您不認識它:

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

bufferp2 完全相同 使用buffer您可以聲明一個字符數組,並將第一個字符分配為'a' ,然后將一個明確的以零結尾的字符 '\\0'分配給您一個字符串"a" 使用p2您可以分配字符串文字"a"並且以null結尾的字符會自動附加到末尾。 無論哪種方式,您都會得到相同的結果, bufferp2包含字符串"a"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM