由于您没有显示声明或对输入字符串进行特别好的描述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)
,但从可用信息中并不完全清楚。