당신이 선언을 표시하거나 입력 문자열의 특히 좋은 설명을 제공하지 않기 때문에 , 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
에 null로 끝나는 문자열을 가져옵니다 (데이터의 길이를 확인할 수있는 다른 방법은 없습니다).
외부 루프의 범위에 a
을 선언하면 루프 끝 부분에서 다시 초기화 할 필요가 없습니다. 카운터를 증가 시키려면 a++
과 i++
을 사용했습니다. 숙련 된 C 프로그래머에게 가독성을 잃지 않으면 서 조밀 한 표기법을 사용할 수 있습니다. 비록 초보 프로그래머가 처리하기가 좀 더 어려울 수 있다고 인정합니다. 그럼에도 불구하고 관용구는 배우는 가치가 있습니다.
내부 루프가 '\0'
과 3 (일명 '\3'
또는 '\003'
)을 확인해야하는지 궁금합니다. 나는 끝이 아닌 temp
에 null이 나타날 수 있는지 여부를 알아야합니다. 표시된 코드는 FrameBuffer
의 오버플로가 없는지 유효성 검사를 수행하는 데 걸리는 시간입니다. 함수가 입력 temp
의 길이를 들었다 경우 더 계속 될 것이다 :
void somefunc(const char *temp, size_t templen, int PacketAction)
코드가 더 탄력적으로 기록 될 수있다. 아마도 strlen(temp)
을 사용할 수 있지만 사용 가능한 정보에서 절대적으로 명확하지는 않습니다.
특히 'FrameBuffer'를 어떻게 선언하는지 더 자세히 보여주십시오. –
또한 문자열 종결 문자' '\ 0''을 추가하지 않으면 문자열로 사용할 수 없습니다. –
나는 이것을 다음과 같이 선언한다 ... char * FrameBuffer = calloc (2048, sizeof (char)); – user1819301