2017-04-18 2 views
0

C 언어를 처음 사용합니다. char 배열과 char을 연결해야합니다. 자바에서는 '+'연산을 사용할 수 있지만 C에서는 허용되지 않습니다. Strcat과 strcpy도 나를 위해 작동하지 않습니다. 이것을 어떻게 할 수 있습니까?문자 배열과 문자 연결

void myFunc(char prefix[], struct Tree *root) { 
    char tempPrefix[30]; 
    strcpy(tempPrefix, prefix); 
    char label = root->label; 
    //I want to concat tempPrefix and label 

내 문제는 그것이 서로 문자 배열을 CONCAT으로 concatenate char array in C 다르다 다음과 같이 내 코드는하지만 광산은 제외 (

+2

[C의 연결 문자 배열] 가능한 복제본 (http://stackoverflow.com/questions/2128290/concatenate-char-array-in-c) –

+1

은 이전 질문과 내 차이점을 설명했습니다. –

+0

에 오신 것을 환영합니다. 스택 오버플로! 지금까지 연구/디버깅 노력을 보여주십시오. 먼저 [Ask] 페이지를 읽으십시오. –

답변

1

. 주된 관심사는 tempPrefix에 접두어 + 원래 문자를위한 충분한 공간이 있어야한다는 것입니다. C 문자열은 null로 끝나야하기 때문에 함수는 28자를 초과하는 접두어를 복사해서는 안됩니다. 30 (버퍼의 크기) - 1 (루트 레이블 문자) -1 (종료 널 문자). 다행히 표준 라이브러리는 strncpy이 있습니다

size_t const buffer_size = sizeof tempPrefix; // Only because tempPrefix is declared an array of characters in scope. 
strncpy(tempPrefix, prefix, buffer_size - 3); 
tempPrefix[buffer_size - 2] = root->label; 
tempPrefix[buffer_size - 1] = '\0'; 

따라서 그것은 당신이 최소한의 변화의 크기를 증가 할 수 있도록 하드 코드하지 또한 함수 호출에서 버퍼 크기 보람입니다.


버퍼가 정확하지 않은 경우 약간의 다리 작업이 필요합니다. 이 방법은 이전과 거의 비슷하지만 그림을 완성하려면 strchr으로 전화해야합니다.

size_t const buffer_size = sizeof tempPrefix; // Only because tempPrefix is declared an array of characters in scope. 
strncpy(tempPrefix, prefix, buffer_size - 3); 
tempPrefix[buffer_size - 2] = tempPrefix[buffer_size - 1] = '\0'; 
*strchr(tempPrefix, '\0') = root->label; 

우리는 다시 최대 28자를 복사합니다. 그러나 명시 적으로 NUL 바이트로 끝을 덧대십시오. 이제 strncpy은 복사 할 문자열이 더 짧을 경우를 대비하여 최대 Null 바이트 인 count으로 채 웁니다. 따라서 실제로 복사 된 접두사 이후의 모든 문자는 \0입니다. 이것이 내가 바로 strchr의 결과를 존중하는 이유이며, 유효한 문자를 가리키는 것이 보장됩니다. 정확한 첫 번째 여유 공간.

+0

여기에 예상 결과가 표시되지 않습니다.추가 된 문자가 tempPrefix char 배열의 28 번째 위치에 있다는 것을 알 수 있습니다. 그러나 인쇄 할 때, 거기에 없습니다. 배열의 끝이 아니라 배열의 현재 텍스트의 다음 위치에 연결해야하지 않습니다. –

+0

@GeorgeKlimas - 내 실수. 'strncpy'는 많아야 * 카운트 문자를 포함합니다. 즉, 통화를 조정해야합니다. 내 세부 사항 편집을 참조하십시오. – StoryTeller

+0

여전히 char 배열에 추가 된 문자가 표시되지 않습니다. 디버그는 캐릭터가 28 위치에 추가되고 있음을 보여줍니다. –

0

strXXX()이 기능의 제품군은 대부분 문자열에서 작동 숯불과 문자 배열입니다 관련 항목 검색), 라이브러리 기능을 직접 사용할 수 없습니다.

기존 Null 종결 자의 위치를 ​​찾아 연결하려는 char 값으로 대체하고 Null 종결자를 추가 할 수 있습니다. 그러나 소스가 연결된 문자열을 보유 할 충분한 공간이 있는지 확인해야합니다. (하지 테스트)이 같은

뭔가 정말 오히려 간단한

#define SIZ 30 


//function 
char tempPrefix[SIZ] = {0};  //initialize 
strcpy(tempPrefix, prefix); //copy the string 
char label = root->label;  //take the char value 

if (strlen(tempPrefix) < (SIZ -1)) //Check: Do we have room left? 
{ 
    int res = strchr(tempPrefix, '\0'); // find the current null 
    tempPrefix[res] = label;    //replace with the value 
    tempPrefix[res + 1] = '\0';   //add a null to next index 
} 
+0

출력을 얻지 못했습니다. 'res'가 마이너스 값을 얻는 것을 볼 수 있습니다. 문제인가? –