代码之家  ›  专栏  ›  技术社区  ›  mbilyanov

比较C中动态分配的字符串

  •  1
  • mbilyanov  · 技术社区  · 2 年前

    我正在研究一个基于另一个函数的返回值动态填充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
    

    如您所见,调试位是正确的值,但由于某些原因 字符串比较函数 正在返回垃圾值。

    1 回复  |  直到 2 年前
        1
  •  0
  •   Akari Oozora    2 年前

    别担心,这些数字不是垃圾,只是 strcmp 作品

    字符串比较函数 退货 0 每当两个字符串匹配时,如果不匹配,则返回第一个字符串之间的差值 char ASCII表中两个字符串的。

    例如:

    的价值 d 从…起 dfr 100 在ASCII表中 s 从…起 sbjk 是115。因此 115 - 100 = 15 ,这就是你得到的回报。

    似乎您只想检查两个字符串是否相等。为此,我建议您使用 !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