char
를 정의했습니다
다음과 같이 미리 정의 된 HTTP 포스트 문자열이있는 배열 :
char header[] = "POST /api/add HTTP/1.1\r\nHost: xxxxxxx:3000\r\nContent-Type: application/octet-stream; charset=utf-8\r\nContent-Length: 500\r\nName: ";
strcat(header, strDevicename); \\
strcat(header, "\r\n\r\n");
strDevicename
char
입니다
변수 이름은 모든 요청마다 변경되었습니다.
문제는 처음으로 실행할 때 작동하지만
Name
를 덮어 쓴 후에 작동합니다.
a96ed5ÿÿa96ed58e8355
와 함께
.
HTTP 포스트 헤더에서 C 언어를 사용하여 하나의 실시간 변경 변수로 두 개의 문자열을 추가하는 가장 좋은 방법은 무엇입니까?
- 답변 # 1
- 답변 # 2
코드에서 배열의 크기
인용구header
는 제공된 이니셜 라이저 문자열의 크기에 따라 결정되며 추가 문자를 저장 (또는추가) 할 수있는 추가 공간이 없습니다.C11
§6.7.9 장 와이즈 비즈다음,
If an array of unknown size is initialized, its size is determined by the largest indexed element with an explicit initializer. The array type is completed at the end of its initializer list.
strcat()
가 가리키는 문자열의 사본을 추가합니다. (포함하는The 가 가리키는 문자열의 끝까지 널 문자 종료) . [...]
strcat
를 나타내는(여기서
s2
)는 연결된 문자열을 보관하기에 충분한 저장 공간이 있어야합니다.따라서
s1
s1
와 함께 할당 된 과거 메모리를 실행할 때 소스로 여기에서 정의되지 않은 동작을 호출합니다.header
를 만들어야합니다 이니셜 라이저 문자열로 채운 후 충분한 공간이 남아 있어야합니다. 배열에 고정 된 크기를 사용하십시오. 초기화 문자열로 채운 후에 훨씬 더 많은 양이 있습니다.strcat()
- 답변 # 3
header
에서 :당신은
아마도 pyzwyz 함수에 로컬로 할당됩니까? 이 경우header
를 보장해야합니다 배열은#define STRSIZ 512 char header[STRSIZ] = "POST /api/add HTT.........
를 작성할 수 있도록 충분히 크게 할당됩니다. 초기 크기 외에도 바이트. 그렇지 않으면 (아마 원격으로 악용 가능한) 버퍼 오버런 취약점이 있습니다.man 3 strcat
사용을 고려해야합니다 또는The strings may not overlap, and the dest string must have enough space for the result. If dest is not large enough, program behavior is unpredictable;buffer overruns are a favorite avenue for attacking secure programs.
header
를 선호해야합니다 평범한strlen(strDeviceName) + 5
이상header
로 추가 할 바이트 수에 대한 추가 인수를 사용하고 오버플로가 발생하더라도 버퍼가 항상 Null로 종료되도록합니다. - 답변 # 4
전체 문자열에 충분한 공간을 할당해야합니다. 맨 페이지 :
alloca
"올바른"방법으로 필요한 것을 정확하게 할당 할 수 있습니다 :
malloc
아니면 게으른 방법으로 전체적으로 정리하십시오 :
strncat
- 답변 # 5
충분한 공간이 필요하므로 새 공간에서 두 공간을 모두 복제 할 수 있습니다 :
strcat
strncat
관련 자료
- r - 인수의 문자열 연결
- loops - powerbi, dax - 문자열 연결, 분할 및 하위 문자열 유지
- 파이썬/팬더에서 명령을 실행하기 위해 문자열을 연결/사용하는 방법
- r - 두 개의 문자열로 연결, 중복 제거
- javascript - 로그인 할 때마다 URL을 변수와 연결하는 방법
- python - 두 변수를 플로팅 한 다음 세 번째 변수로 채색
- assembly - MASM x86에서 문자열을 어떻게 연결합니까?
- dataframe - 파이썬에서 문자열을 분할하고 부분을 연결하는 방법이 있습니까?
- excel : VBA 수식에서 변수를 연결하는 방법은 무엇입니까?
- python - 두 번째 및 세 번째 문자열을 문자열로 교체
- c - 두 문자열을 연결하고 함수에서 반환 할 수 없습니다
- 쉼표를 사용하여 PowerShell에서 문자열을 연결하는 이유는 무엇입니까?
- r - 문자열을 붙여 넣어 변수를 참조한 다음 변경하고 원래 변수에서 참조되었는지 확인합니다
- Python - 파이썬 - 3 분의 1에 따라 두 변수의 합이있는 행렬
- apache spark - 두 문자열 사이에 세 번째 문자열도있는 경우 두 문자열 사이의 텍스트 추출-Pyspark
- BigQuery에서 문자열 연결
- python - 팬더는 그룹 별 열을 포함한 문자열을 연결합니다
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- JavaScript 변수를 HTML div에 '출력'하는 방법
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- python - 화면에서 찾은 요소를 찾을 수없는 경우 셀레늄
문제는 당신이 배열에 연결되어 있다는 것입니다 (
header
) 추가 공간이 없습니다 (C 배열의 크기를 변경할 수 없음).snprintf
여기에 더 잘 맞을 수 있습니다.strDevicename
의 최대 길이를 알고 있다면 고정 크기 버퍼를 사용할 수 있습니다 :strDevicename
인 경우 길이가 알려지지 않은 경우asprintf
를 사용할 수 있습니다. (GNU 기능) :당신이
asprintf
사용할 수없는 경우malloc
를 사용하여 충분한 메모리를 (위와 같이) 할당 할 수 있습니다 그런 다음snprintf
를 사용하십시오. .