【问题标题】:Comparing a string from a file and a malloced string in C比较文件中的字符串和 C 中的 malloced 字符串
【发布时间】:2021-04-12 03:16:13
【问题描述】:

我正在尝试遍历一个文本文件并为每一行检查一个特定的子字符串 使用内存分配创建的就在其中。 我的问题是,为了使 malloc 的字符串完好无损,我需要在其末尾添加 \0 。 因为否则它会在最后包含一些乱码。 这导致我对 strstr 的使用无关紧要,因为它会搜索该字符串,但最后有一个额外的 \0 会导致搜索失败。

int compare(char *X,char *Y,int size)
{
    while (size >0 && *X && *Y)
    {
        if (*X != *Y)
            return 0;
        X++;
        Y++;
        size--;
    }
    return (*Y == '\0');
}

char* substring(char* X, char* Y, int size)
{
    while (*X != '\0')
    {
        if (compare(X, Y, size))
        {
            printf("in\n");
            return X;
        }
        X++;
    }
    return NULL;
}

对于实际调用:

if (substring(temp, lua_name, strlen(lua_name)-1) != NULL)
{
  puts(temp);
}

例如:

payloadSubtree:add(roy_fields.my_data_req,buffer(offset,2))
my_data_req\0

我该如何解决这个问题?如何在迭代时忽略第二个字符串的 \0 以便在文件中找到它?

【问题讨论】:

  • 为什么要添加/0,而不是\0
  • 可能你的意思是strlen(lua_name) - 1代替strlen(lua_name - 1)
  • strlen(lua_name - 1) 为什么要从字符串中减去?您的意思是从strlen 结果中减去吗?即使是这样,为什么? strlen 不计算 NUL 终止符。
  • @MikeCAT 是的,我现在修好了,抱歉在这里写错了。
  • @IrAM 修复它,错过复制它

标签: c string function substring


【解决方案1】:

您可以使用strnstr 代替strstr,并搜索strlen(str) 字符。

【讨论】:

  • 嘿 @Tsak 我使用了 strnstr 的 stackoverflow 中的在线实现,并调用了这样的函数 printf("%d\n", strnstr("hey p_type yo", lua_name, strlen (lua_name)) == NULL ? 0 : 1);但它仍然无法在字符串中识别它并返回 0 。 lua_name 包含 p_type\0 。我错过了什么吗?很想听听你的想法!
  • 好吧,我很菜鸟,确实 strnstr 不是正确的解决方案,因为它只会在 n char 上搜索包含文件文本的字符串,正如 Erdal Küçük 建议的那样,memmem() 可以你有兴趣可以搜索 n char of needle 到 n char of haystack 中,我猜你在读取 txt 文件并将其放入缓冲区时会得到 txt 文件中的字符数
【解决方案2】:

如果你想对以 nul 结尾的数组进行操作:strstr
如果要对指定大小的数组进行操作:memmem

【讨论】:

  • 在 C teamülünde 中,一个函数在其名称中具有包含字母“n”的替代项,例如strnstr,应该优先于那个不是的。
  • @snr 我以为strnstr 只是BSD?在 C 标准(C11 草案 N1570)中,我找不到 strnstr 。该问题没有标签“bsd”,只有“c”。
  • @snr 好的,我同意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多