比较 C 中动态分配的字符串
Comparing dynamically allocated strings in C
我正在处理一个基于另一个函数的 return 值动态填充 char 数组的案例。
在某些时候,我想将传入的值与静态字符串进行比较并触发一个动作。
出于某种原因,我无法使用 strcmp
函数。这是我的代码和相应的输出。
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* word_generator(int selector)
{
switch(selector)
{
case 0:
return "a";
break;
case 1:
return "jk";
break;
case 2:
return "dfr";
break;
case 3:
return "sbjk";
break;
default:
printf("ERROR: Request out of range!\n");
}
return "";
}
int main () {
for(int i = 0; i < 4; i++)
{
printf("Test string[%d]: %s\n", i, word_generator(i));
printf("\t__STRLEN: %lu\n", strlen(word_generator(i)));
char* input_char_buffer = malloc(strlen(word_generator(i))+1);
strcpy(input_char_buffer, word_generator(i));
printf("\tCurrent buffer (value: %s, length: %zu)\n", input_char_buffer, strlen(input_char_buffer));
char key[] = "dfr";
printf("\tCurrent key (value: %s, length: %zu)\n", key, strlen(key));
/* if(strlen(input_char_buffer) == strlen(key)) */
/* { */
/* printf("\t\tOK\n"); */
/* } */
int ret;
ret = strcmp(input_char_buffer, key);
printf("\t__STRCMP: %d\n", ret);
if(ret == 1)
{
printf("\t\tOK\n");
}
// Clean-up.
free(input_char_buffer);
input_char_buffer = NULL;
}
return 0;
}
输出:
Test string[0]: a
__STRLEN: 1
Current buffer (value: a, length: 1)
Current key (value: dfr, length: 3)
__STRCMP: -3
Test string[1]: jk
__STRLEN: 2
Current buffer (value: jk, length: 2)
Current key (value: dfr, length: 3)
__STRCMP: 6
Test string[2]: dfr
__STRLEN: 3
Current buffer (value: dfr, length: 3)
Current key (value: dfr, length: 3)
__STRCMP: 0
Test string[3]: sbjk
__STRLEN: 4
Current buffer (value: sbjk, length: 4)
Current key (value: dfr, length: 3)
__STRCMP: 15
如您所见,调试位是正确的值,但由于某种原因 strcmp
是 returning 垃圾值。
别担心,这些数字不是垃圾,这就是 strcmp
的工作原理。
strcmp
returns 0
只要两个字符串匹配,如果不匹配,它 returns 与第一个 char
ASCII table.
中的两个字符串
例如:
来自dfr
的d
的值在ASCII table中是100
,而来自sbjk
的s
是115。因此, 115 - 100 = 15
, 这就是你得到的 return。
您似乎只想检查两个字符串是否相等。为此,我建议您使用 !strcmp()
而不是 strcmp
。这样,如果字符串匹配,您将得到 1
,否则将得到 0
。您可以稍后查看逻辑操作数 !
的工作原理以及发生这种情况的原因。
您可以看到更改生效:
Test string[0]: a
__STRLEN: 1
Current buffer (value: a, length: 1)
Current key (value: dfr, length: 3)
__STRCMP: 0
Test string[1]: jk
__STRLEN: 2
Current buffer (value: jk, length: 2)
Current key (value: dfr, length: 3)
__STRCMP: 0
Test string[2]: dfr
__STRLEN: 3
Current buffer (value: dfr, length: 3)
Current key (value: dfr, length: 3)
__STRCMP: 1
OK
Test string[3]: sbjk
__STRLEN: 4
Current buffer (value: sbjk, length: 4)
Current key (value: dfr, length: 3)
__STRCMP: 0
我正在处理一个基于另一个函数的 return 值动态填充 char 数组的案例。
在某些时候,我想将传入的值与静态字符串进行比较并触发一个动作。
出于某种原因,我无法使用 strcmp
函数。这是我的代码和相应的输出。
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* word_generator(int selector)
{
switch(selector)
{
case 0:
return "a";
break;
case 1:
return "jk";
break;
case 2:
return "dfr";
break;
case 3:
return "sbjk";
break;
default:
printf("ERROR: Request out of range!\n");
}
return "";
}
int main () {
for(int i = 0; i < 4; i++)
{
printf("Test string[%d]: %s\n", i, word_generator(i));
printf("\t__STRLEN: %lu\n", strlen(word_generator(i)));
char* input_char_buffer = malloc(strlen(word_generator(i))+1);
strcpy(input_char_buffer, word_generator(i));
printf("\tCurrent buffer (value: %s, length: %zu)\n", input_char_buffer, strlen(input_char_buffer));
char key[] = "dfr";
printf("\tCurrent key (value: %s, length: %zu)\n", key, strlen(key));
/* if(strlen(input_char_buffer) == strlen(key)) */
/* { */
/* printf("\t\tOK\n"); */
/* } */
int ret;
ret = strcmp(input_char_buffer, key);
printf("\t__STRCMP: %d\n", ret);
if(ret == 1)
{
printf("\t\tOK\n");
}
// Clean-up.
free(input_char_buffer);
input_char_buffer = NULL;
}
return 0;
}
输出:
Test string[0]: a
__STRLEN: 1
Current buffer (value: a, length: 1)
Current key (value: dfr, length: 3)
__STRCMP: -3
Test string[1]: jk
__STRLEN: 2
Current buffer (value: jk, length: 2)
Current key (value: dfr, length: 3)
__STRCMP: 6
Test string[2]: dfr
__STRLEN: 3
Current buffer (value: dfr, length: 3)
Current key (value: dfr, length: 3)
__STRCMP: 0
Test string[3]: sbjk
__STRLEN: 4
Current buffer (value: sbjk, length: 4)
Current key (value: dfr, length: 3)
__STRCMP: 15
如您所见,调试位是正确的值,但由于某种原因 strcmp
是 returning 垃圾值。
别担心,这些数字不是垃圾,这就是 strcmp
的工作原理。
strcmp
returns 0
只要两个字符串匹配,如果不匹配,它 returns 与第一个 char
ASCII table.
例如:
来自dfr
的d
的值在ASCII table中是100
,而来自sbjk
的s
是115。因此, 115 - 100 = 15
, 这就是你得到的 return。
您似乎只想检查两个字符串是否相等。为此,我建议您使用 !strcmp()
而不是 strcmp
。这样,如果字符串匹配,您将得到 1
,否则将得到 0
。您可以稍后查看逻辑操作数 !
的工作原理以及发生这种情况的原因。
您可以看到更改生效:
Test string[0]: a
__STRLEN: 1
Current buffer (value: a, length: 1)
Current key (value: dfr, length: 3)
__STRCMP: 0
Test string[1]: jk
__STRLEN: 2
Current buffer (value: jk, length: 2)
Current key (value: dfr, length: 3)
__STRCMP: 0
Test string[2]: dfr
__STRLEN: 3
Current buffer (value: dfr, length: 3)
Current key (value: dfr, length: 3)
__STRCMP: 1
OK
Test string[3]: sbjk
__STRLEN: 4
Current buffer (value: sbjk, length: 4)
Current key (value: dfr, length: 3)
__STRCMP: 0