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

Comparing dynamically allocated strings in C

提问人:mbilyanov 提问时间:5/29/2022 最后编辑:halfermbilyanov 更新时间:6/1/2022 访问量:204

问:

我正在研究一种情况,即我根据另一个函数的返回值动态填充 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

阵列 c char malloc

评论

0赞 Andreas Wenzel 5/29/2022
该函数将在相等时返回。您似乎在比较 with 的返回值,这没有意义。strcmp0strcmp1
0赞 mbilyanov 5/29/2022
啊。答案是肯定的。谢谢。
0赞 Andreas Wenzel 5/29/2022
与其创建函数,不如简单地将其设置为指向字符串文字的指针数组: 您现在可以访问这些单词,例如: 将为您提供指向 的指针。使用函数的唯一优点是可以进行边界检查。word_generatorchar *words = { "a", "jk", "dfr", "sbjk" };words[2]"dfr"
0赞 mbilyanov 5/29/2022
谢谢!我正在尝试了解 C 字符串,就我而言,我想使用 char 数组来存储具有不同长度的字符序列。类似于文件名存储在 char 数组中的情况,并且该文件名每次都会有所不同,字符串长度可能会有所不同。所以里面的功能将被一个更复杂的阶段所取代。

答:

2赞 Akari Oozora 5/29/2022 #1

别担心,这些数字不是垃圾,只是工作原理。strcmp

strcmp每当两个字符串匹配时返回,如果它们不匹配,则返回 ASCII 表中两个字符串中第一个字符串之间的差值。0char

例如:

from 的值在 ASCII 表中,而 from 的值为 115。因此,这就是你得到的回报。ddfr100ssbjk115 - 100 = 15

似乎您只想检查两个字符串是否相等。为此,我建议您使用而不是 .这样,您将拥有字符串是否匹配。您可以稍后检查逻辑操作数的工作原理以及发生这种情况的原因。!strcmp()strcmp10!

您可以看到更改正在起作用:

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

评论

1赞 mbilyanov 5/29/2022
感谢您的帮助。我还在学习 C 语言的内存管理,所以我认为我搞砸了与指针或内存有关的东西。
0赞 Andreas Wenzel 5/29/2022
“如果它们不这样做,它将返回 ASCII 表中两个字符串的第一个字符之间的差值。” -- 尽管这可能是多种实现的常见行为,但不能保证在 ISO C 中会发生这种情况。实际上,我至少遇到过一次这种情况不会发生的情况。有关 ISO C 实际保证的信息,请参阅此文档