1

この関数は、バッファに追加された文字列を参照し、指定されたフィールドを検索します。フィールドがバッファ内で見つかった場合、割り当てられたコンテンツへのポインタが返されます。指定されたフィールドがバッファ内に見つからない場合は、「?」へのポインタ 文字列が配信されます。

#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;
}

実行後、私は常に?出力として取得していますが、コードの何が問題になっていますか?2つ目の注意点として、上記のコードで置き換えることstrlenをお勧めしますか?を返します。sizeofsizeof(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ます。

4

4 に答える 4

0

ループ内は、次の場合にreturnのみ実行できます。p[nl]'='

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

ただし、文字列には何も含まれていないため、常に実行される'='のは最終的なものです。return "?"

于 2013-01-24T10:36:51.977 に答える
0

これはあなたの質問に対する正確な答えではないかもしれませんが、ロジックはかなり複雑に見えます。問題を解決するためにsubstr()を実行できません。さらに、(strncmp(p、name、nl)== 0 && p [nl] =='=')p [nl]=='='である場合に私が見つけた1つの間違いは決して真ではありません。

于 2013-01-24T10:40:10.880 に答える
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 "?";
}
于 2013-01-24T10:49:50.757 に答える
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";
}

LiveWorkSpaceでの出力

于 2013-01-24T10:50:54.190 に答える