1

这是我正在使用的代码...

while(temp[i]!=0){
    while(temp[i]!=3){
        FrameBuffer[a]=temp[i];
        i++;
        a++;
    }
    FrameBuffer[a]=temp[i];
    printf(" Framebuffer: %s ", FrameBuffer);
    result=layer1(FrameBuffer,PacketAction);
    i++;
    a=0;
}

问题是我希望 FrameBuffer 在每次通过内部 while 循环时都被重置(在循环开始时 FrameBuffer 的大小为 0)。我尝试使用 free(FrameBuffer) 但我收到错误,因为我多次释放数组。我也试过写 FrameBuffer=NULL,但是没有用。任何帮助将不胜感激。谢谢!

4

2 回答 2

2

如果您只需要在每个内部循环开始之前初始化 FrameBuffer,memset可以使用-:

while(temp[i]!=0) {
    memset(FrameBuffer, 0, sizeof(FrameBuffer));

    while(temp[i]!=3) {
于 2013-04-14T19:39:43.137 回答
0

由于您没有显示声明或对输入字符串进行特别好的描述temp,因此很难知道您在做什么。

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

extern int somefunc(const char *fb, int pa);
extern int layer1(const char *fb, int pa);

int somefunc(const char *temp, int PacketAction)
{
    int rc = 0;
    char *FrameBuffer = calloc(2048, sizeof(char));
    if (FrameBuffer != 0)
    {
        int i = 0;
        while (temp[i] != '\0')
        {
            int a = 0;
            while (temp[i] != 3)
                FrameBuffer[a++] = temp[i++];
            FrameBuffer[a++] = temp[i++];
            FrameBuffer[a] = '\0';
            assert(a < 2048);
            printf("Framebuffer: %.*s\n", a, FrameBuffer);
            int result = layer1(FrameBuffer, PacketAction);
            if (rc == 0)
                rc = result;
        }
    }
    return rc;
}

这可能就足够了。该函数在其中layer1获取一个以空字符结尾的字符串FrameBuffer(它没有其他可见的方法来确定数据的长度)。

请注意,通过a在外部循环的范围内声明,我不需要在循环结束时重新初始化它。我已经使用a++andi++来增加计数器;它允许紧凑的表示法,而不会损失经验丰富的 C 程序员的可读性——尽管我承认对于新手程序员来说处理起来可能有点困难。尽管如此,这个成语还是值得学习的。

我想知道内部循环是否应该检查'\0'3 (aka '\3'or '\003'); 我需要知道temp除了最后之外是否会出现空值。显示的代码采用了一种懒惰的方式来验证FrameBuffer. 如果函数被告知输入的长度会更好temp

void somefunc(const char *temp, size_t templen, int PacketAction)

可以更有弹性地编写代码。它可能使用strlen(temp),但从可用信息中并不完全清楚。

于 2013-04-14T20:03:27.660 回答