strlen에서char*의 크기 문제를 가져옵니다

1670 단어
Char* 형식 문자열을 가져올 시간이 많을 때 strlen을 사용하면 new 이char*보다 크기가 큰 것을 발견할 수 있습니다.
코드는 다음과 같습니다.
	HANDLE hfile = CreateFile(str1, GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, NULL);
	if(hfile == INVALID_HANDLE_VALUE)
	{
		AfxMessageBox("      !");
		return ;
	}
	DWORD dwsize = GetFileSize(hfile, NULL);
	char *pDataBuf = new char[dwsize];
	DWORD dwread = 0;
	ReadFile(hfile, pDataBuf, dwsize, &dwread, NULL);
	char da = pDataBuf[dwsize];
	int i = strlen(pDataBuf);
	//base64  
	char *pOutBuf;
	pOutBuf = base64_encode(pDataBuf,dwsize);
	delete []pDataBuf;
	CloseHandle(hfile);

strlen에서 가져온 pDataBuf의 크기는dwsize보다 4가 큽니다.
strlen 사용법:
 int strlen(const char *str)

  {

  assert(str != NULL);

  int len = 0;

  while((*str++) != '/0')

  len++;

  return len;

  }

strlen이 검색 문자열의 "\0", 즉 끝자임을 알 수 있습니다.원본 코드에서 pDataBuf의 모든 바이트가 데이터에 기록되어 있으며,strlen은 찾을 때 '\0' 을 찾을 수 없기 때문에 정확한 문자열 길이를 얻을 수 없습니다.pDataBuf의 크기를 신청할 때 한 바이트를 더 신청한 다음 마지막 바이트의 값을 "\0"으로 설정할 수 있습니다.수정된 코드는 다음과 같다
	HANDLE hfile = CreateFile(str1, GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, NULL);
	if(hfile == INVALID_HANDLE_VALUE)
	{
		AfxMessageBox("      !");
		return ;
	}
	DWORD dwsize = GetFileSize(hfile, NULL);
	char *pDataBuf = new char[dwsize+1];
	memset(pDataBuf, '\0', dwsize+1);
	DWORD dwread = 0;
	ReadFile(hfile, pDataBuf, dwsize, &dwread, NULL);
	char da = pDataBuf[dwsize];
	int i = strlen(pDataBuf);
	//base64  
	char *pOutBuf;
	pOutBuf = base64_encode(pDataBuf,dwsize);
	delete []pDataBuf;
	CloseHandle(hfile);
이때 가져온 pDataBuf의 크기는dwsize와 같습니다.

좋은 웹페이지 즐겨찾기