2016-12-21 7 views
-1

와 CHAR 문자열을 처리하는 데 도움이 필요하고 나는 다음과 같은 코드를 사용하여 시리얼로 문자열을 밀어 오전 : 나는 대체 할 수 있어야합니다내가 블루투스 모뎀과 통신 할 수 softserial 사용하고 printf와

char bt_string = "test"; 
bluetooth_println(bt_string); 

을 나는 다음과 같은 코드를 시도

printf(" Error: cmd=%02hX, res=%02hX\n", CMD_SEND_CID, res); 

와 문자열

char bt_string; 
sprintf(bt_string, " Error: cmd=%02hX, res=%02hX\n", CMD_SEND_CID, res); 
bluetooth_println(bt_string); 

그러나 출력 A를 실패 아니야. 나는 분명히 뭔가를 오해하고있다. 어떤 도움을 주셔서 감사합니다.

답변

4

문자열에 버퍼를 제공해야합니다.

char bt_string[256]; // <-- or any size that you are sure will be enough for what you will put in. 

결국 안전을 위해 당신은 어떤 버퍼 오버 플로우를 방지하기 위해 snpritf를 사용할 수 있습니다

#define MAX_BT_STRING 256 
char bt_string[MAX_BT_STRING]; 
snprintf(bt_string, MAX_BT_STRING," Error: cmd=%02hX, res=%02hX\n", CMD_SEND_CID, res); 
bluetooth_println(bt_string); 
+0

감사합니다. 항상 단순한 무언가. 위대한 작품 – Eddie

1

char *strchar str[]는 분명히 다르다. 자세한 내용은 this question을 확인하십시오.

문제점에서 bt_string을 const char *bt_string = "test"으로 선언했습니다. 여기서 bt_string은 "test"문자열의 첫 번째 문자를 가리키는 포인터입니다. 이 문자열의 크기는 5 바이트입니다 (터미네이터 \ 0을 잊지 마십시오). 다음 단계에서

는 :

sprintf(bt_string, " Error: cmd=%02hX, res=%02hX\n", CMD_SEND_CID, res); 

만 5 바이트 사용 가능한 공간이있는 bt_string하는 5 개 이상의 바이트를 덤프. 5 바이트를 넘는 부분은 bt_string 이후의 내용을 덮어 씁니다. 심각한 상황이나 아무런 결과를 초래할 수 있습니다. A.S.H 대답으로

  1. 는 스택에 할당 :

    는 충분한 메모리 공간을 할당해야이 문제를 해결하려면. 함수가 끝난 후에 내용이 결정됩니다.
  2. allocate via malloc;
  3. 정적 키워드를 사용하여 BSS 섹션이나 DATA 섹션에 저장된 문자열을 강제로 지정합니다.
+0

그것을 보아 주셔서 감사합니다. 질문을 입력하는 것은 오타였습니다. – Eddie