此功能浏览添加到缓冲区中的字符串并搜索指定的字段。如果在缓冲区中找到该字段,则返回指向所分配内容的指针。如果在缓冲区内找不到指定的字段,则指向“?”字符串已发送。
#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
。
答案 0 :(得分:0)
循环内的return
只能在p[nl]
等于'='
时执行:
if (strncmp (p, name, nl) == 0 && p[nl] == '=')
^^^^^^^^^^^^^^^
但是,您的字符串中没有'='
,因此它始终会被执行的最终return "?"
。
答案 1 :(得分:0)
这可能不是您问题的确切答案,但逻辑看起来相当复杂。你不能 substr()来解决问题。此外我可以在中找到1个错误如果(strncmp(p,name,nl)== 0&amp;&amp; p [nl] =='=')是 p [nl] = ='='永远不会成真。
答案 2 :(得分:0)
我认为这是你正在寻找的行为:
#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 "?";
}
答案 3 :(得分:0)
为什么要为字符串匹配这样常见的东西编写自己的代码? 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";
}
上的输出