2013-11-09 2 views
0

C를 사용하여 android 용 네이티브 앱을 쓰고 있습니다. 어딘가에 간단한 C 코드를 작성하여 하위 문자열을 가져 오려는 평범한 일을하고 싶습니다. 이 코드입니다 : 내가 컴파일하고 PC에서이 코드를 실행, 내가 예상 결과를 얻을,하지만 안드로이드에서 실행할 때, 항상의 흐름을 손상 말에 이상한 문자가있는 경우문자열 끝에있는 이상한 문자 (0010)

char* get_part_allocated(const char* src, int start, int len) 
{ 
    LOGI("copying [%s] from [%d] len [%d]\n", src, start, len); 
    int nlen = len+1; 
    char* alloc = (char*)malloc(nlen*sizeof(char)); 
    strncpy(alloc, src+start, len); 
    LOGI("result is: [%s]\n", alloc); 
    return alloc; 
} 

내 프로그램에 장애가 발생합니다! 나는 패딩 더 NULL을, 2 또는 3을 시도했지만 아무 것도 변경하지 않은 enter image description here

:

이는 로그 캣 출력의 스크린 샷입니다!

누군가가 어떤 내용인지 알고 어떻게 제거 할 수 있습니까?

답변

2

alloc도 아니고 strncpy도 새로 할당 된 메모리를 소거하지 않습니다. 새 문자열 끝에 수동으로 0을 추가해야합니다.

은 아마 당신은 당신의 바탕 화면에 디버그 모드에서 이것을 실행하고 컴파일러 많이 디버그 모드 (전용)에서 새롭게 할당 된 메모리에서 영을한다.

alloc[len] = 0; 

참고 : 당신은 C에서 malloc에 ​​캐스팅 안/필요 않는다 : Do I cast the result of malloc?

+0

죄송합니다. 개발자를 붙잡는 것을 멈추지 않는 동일한 오래된 실수 : D Thank you. – Mousa

+0

그리고 메모에 대해 고맙지 만, 그것을 던지면 ndk 오류가 발생합니다 : "함수에서 'char * get_part_allocated (char const *, int, int)': 오류 : 'void *'에서 ' char * '[-fpermissive] "ndk가 C++ 컴파일러를 사용하고있는 것 같습니다. 맞습니까? – Mousa

+1

올바른지, 캐스트는 C에서는 선택적이며 불필요하지만 C++에서는 필수 *입니다. 그것은 .cpp 대신에 .cpp를 컴파일하는 것을 의미 할 수도 있습니다. 보시다시피이 비교적 유해한 부작용이 있지만 다른 것이있을 수 있습니다. 컴파일러에서 .cpp에 대해 C를 사용하고 C++에 .cpp 파일을 사용하도록 할 수 있는지 확인하십시오. – usr2564301

1

이유는 strncpy에서 나던 NULL 종료됩니다

가 필요한 모든

이 추가 라인 대상 문자열 그래서 코드는 아래처럼 보일 것입니다.

strncpy(alloc, src+start, len); 
alloc[len]='\0' ; 

이렇게하면 문제가 해결됩니다.

+0

Sagar에게 감사드립니다. 예, 문제가되었습니다. 문서를 오해하고 그 기능이 저를 위해 그렇게 할 것이라고 생각했기 때문입니다. – Mousa