这是我正在使用的代码......
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,但这不起作用。任何帮助将不胜感激。谢谢!
答案 0 :(得分:2)
如果您只需要在每个内循环开始之前初始化FrameBuffer,可以使用memset
- :
while(temp[i]!=0) {
memset(FrameBuffer, 0, sizeof(FrameBuffer));
while(temp[i]!=3) {
答案 1 :(得分: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++
和i++
来增加计数器;它允许使用紧凑的符号而不会损失经验丰富的C程序员的可读性 - 尽管我承认它对于新手程序员来说可能会有点难度。不过,这个成语值得学习。
我想知道内循环是否应检查'\0'
以及3(又名'\3'
或'\003'
);我需要知道空值是否可以出现在temp
而不是最后。显示的代码采用了一种懒惰的方式来验证FrameBuffer
没有溢出。如果函数被告知输入temp
的长度,那就更好了:
void somefunc(const char *temp, size_t templen, int PacketAction)
代码可以更有弹性地编写。它可能使用strlen(temp)
,但现有信息并不完全清楚。