【问题标题】:Find string in buffer在缓冲区中查找字符串
【发布时间】:2013-01-24 10:31:07
【问题描述】:

此函数浏览添加到缓冲区中的字符串并搜索指定字段。如果在缓冲区中找到该字段,则返回指向分配内容的指针。如果在缓冲区内未找到指定字段,则指向“?”的指针字符串已交付。

#include <stdio.h>
#include <string.h>

char buf[256] = "ID=1234 Name=Manavendra Nath Manav Age=30";

const char * get_info (const char *name)
{
    unsigned   nl;
    const char *p, *e;

    if(name!=NULL)
    {
        nl = strlen(name);
        for (p = buf, e = p + strlen(buf) ; p < e && p[0] ; p += strlen(p) + 1) {
            printf("p = %s\tname = %s\te = %s\n", p, name, e);
            if (strncmp (p, name, nl) == 0 && p[nl] == '=')
                return (p + nl + 1);
        }
    }
    return "?";
}

int main()
{
    printf("strlen(buf) = %d\n", strlen(buf));
    printf("%s\n", get_info("Nath"));
    return 0;
}

执行后,我总是得到? 作为输出,代码有什么问题?第二点,在上面的代码中将strlen 替换为sizeof 是否可取? sizeof(buf) 返回256

manav@os-team:~/programs/test$ ./a.out
strlen(buf) = 21
p = Manavendra Nath Manav       name = Nath     e =
?

编辑:抱歉,我之前没有更新p[nl] == '='。如果缓冲区像 char buf[256] = "ID=1234 Name=Manavendra Nath Manav Age=30"; 然后 get_info("Name") 应该返回 Manavendra Nath Manav

【问题讨论】:

  • 根据您的描述,听起来您只是想写strstr,但这不是您的代码所做的。你能展示你想要的结果吗?
  • 你可以使用C++吗?

标签: c string sizeof strlen


【解决方案1】:

循环内的return只有在p[nl]等于'='时才能执行:

        if (strncmp (p, name, nl) == 0 && p[nl] == '=')
                                       ^^^^^^^^^^^^^^^

但是,您的字符串中没有'=',所以总是会执行最后一个return "?"

【讨论】:

    【解决方案2】:

    这可能不是您问题的确切答案,但逻辑看起来相当复杂。你不能 substr() 来解决这个问题。此外,我在 if (strncmp (p, name, nl) == 0 && p[nl] == '=') 中发现的 1 个错误是 p[nl] == '= ' 永远不会是真的。

    【讨论】:

      【解决方案3】:

      我认为这是您正在寻找的行为:

      #include <string>
      
      const char * get_info_2(const char * name){
        std::string str_1(buf);
        std::string str_2(name);
        for (unsigned int i = 0; i < str_1.size() - str_2.size(); ++i){
          if (str_1.substr(i,str_2.size()).compare(str_2) == 0){
            return str_1.substr(i,str_2.size()).c_str();
          }
        }
        return "?";
      }
      

      【讨论】:

        【解决方案4】:

        您为什么要为字符串匹配这样常见的事情编写自己的代码? STL 有几种方法可以做到这一点,最简单的是使用std::string

        #include <iostream>
        #include <string>
        
        char buf[256] = "Manavendra Nath Manav";
        char sub[256] = "Nath";
        
        int main()
        {
            std::string bufs(buf);
            std::string subs(sub);
        
            auto pos = bufs.find(sub);
            if (pos != std::string::npos)
                std::cout << bufs.substr(pos, subs.length()) << "\n";
            else
                std::cout << "?\n";
        }
        

        LiveWorkSpace 上的输出

        【讨论】:

        • @Claptrap 原来的帖子被标记为 C++,其他人删除了它。
        猜你喜欢
        • 2023-03-16
        • 1970-01-01
        • 2011-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-10
        • 1970-01-01
        相关资源
        最近更新 更多