-3

我正在尝试在 : :amf aa :amfe 之类的东西之间进行解析。但是添加了一些额外的值到字符串中。在代码中,一切都更加具体

char *aparse(char *str,char *a1,char *a2)
{
    char *aa;
    char *cr = strstr(str,a1);
    char *sr =  strstr(str,a2);
    int first = cr-str;
    int second =  sr-str;
    int ftag = first+5;
    int stag  = second-1;
    long wtag = stag-ftag;
    int i=0;


    aa =  malloc(wtag);


    for (i=0; i<wtag; i++)
    {
        aa[i] = str[ftag];

        ftag++;

    }


printf ("%s\n",aa);
return aa;
}

这是我的解析器代码。

    char *aa = ":amf gosadaogle :amfe :fil doc :file";
char *music = aparse(aa,":amf",":amfe");
char *o = aparse(aa,":fil",":file");

这就是我调用函数的方式。但是其中一个字符串带有来自我不知道的地方的额外字符。它就像 o = doc 但音乐 = gosadaogle 。我制作了一个数组并且额外的值消失了。但是我想做malloc。我该如何解决

对不起,我想我不能清楚地告诉我我的问题

这将解释

我试图提取 :amf 和 :amfe 之间的值。而我用 aparse 提取一些添加到音乐或 o 变量中的额外字符

4

1 回答 1

0

据我所知,我从未看到您正在向字符串添加零终止符。在 C 语言中,您必须在字符串的末尾放置一个 '\0' 来标记它的结束。(这也是为什么分配的字符串大小必须是字符数 + 1)。如果你没有这样的结束标记,你会在字符串之后得到随机垃圾。

我猜 wtag 的计算是计算结果字符串的长度,所以你遇到了缺少“+1”大小的问题。另一个问题是您正在ftag用“任意”数字“5”来抵消该值,而它应该取决于strlen(a1).

我还想补充一些其他注意事项:

  1. 您用来调用解析器的代码可能会警告您将 a 转换const char *为非常量值。这是因为char *aparse(char *str,char *a1,char *a2)使编译器认为您希望能够修改传递的字符串。您应该将其更改为,char *aparse(const char *str, const char *a1, const char *a2)因为您不会修改任何参数。
  2. 您可以使用 strncpy() 来复制字符串,而不是自己编写复制函数,这将加快更长字符串的复制过程。还要注意在将字符串复制为 strncpy 后添加一个 '\0' 不一定会为您执行此操作。
  3. 您应该检查是否返回strstrNULL,因为这可能发生在.a1a2str
于 2013-02-23T10:14:10.577 回答