比较 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.

中的两个字符串

例如:

来自dfrd的值在ASCII table中是100,而来自sbjks是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