2012-12-05 2 views
0
난처럼 하나 개의 문자를 CONCAT 할
void concat(char *str, char *ch, int num) 
{ 
    *str= *ch; ++str; 
    while (num>0) { 
     *str = '0' + num % 10; 
     num /= 10; 
     ++str; 
    } 
} 

concat(runner, 'a', 10); 

concat(runner, 'b', 20); 

'A'(10)에, 예상되는 결과는 A10 될 첫 번째 줄은 잘 작동합니다. 하지만 첫 번째 줄 (concat a10) 이후에 생각하면 주자는 문자열의 끝을 가리켜 야하므로 두 번째 줄을 실행하면 a10b20이되어야하지만 실제 결과는 b20이 a10을 덮어 쓰는 것입니다. 포인터 문제가 있어야한다고 생각합니다. 도와주세요.포인터 C에서 유지할 수없는 ++ 기능은

+0

a10은 char이 아닙니다. 함께 작업하려면 일련의 문자가 필요합니다. –

+7

이것이 C++ 인 경우'std :: string'을 사용하면 어떨까요? –

+0

'concat'는 두 번째 매개 변수로'char *'를 기대하며'char'를 전달합니다. 이것도 어떻게 컴파일됩니까? – Praetorian

답변

1

&을 사용하는 것이 좋습니다 이거나 실제로는 ** 사용할 수 있습니다.

0

글쎄, 코드는 당신이 요구 한대로 처리합니다.

void concat(char *str, char *ch, int num) 
{ 
    str += strlen(str); /* make sure we start adding at the end of str */ 
    *str= *ch; ++str; 
    while (num>0) { 
     *str = '0' + num % 10; 
     num /= 10; 
     ++str; 
    } 
} 

을하지만 지금은 당신이 처음

2

에서 [0] 0 STR 확인해야합니다 :이를 위해

는 당신이 첫 번째 문자열의 끝을 찾아 다음에 추가 할 필요가 작동하려면 나는 내 대답을 모두 바꾸고있다. 이것을 기능의 시작 부분에 넣으십시오 :

void concat(char * str, const char * ch, int num) { 
    while (*str) { 
     ++str; 
    } 

그런 다음 나머지는 동일하게 유지하십시오. 이것은 실제로 concat이 어떻게 보일 것인가입니다. 처음으로 호출하기 전에 runner [0] == 0인지 확인하십시오! 그리고 마지막 중괄호 전에, 함수의 끝에 다음 코드를 추가 할 때마다 CONCAT를 호출

*str = 0; 
} 
+0

또한 경고를 피하기 위해'concat'을'void concat (char * & str, char const * ch, int num)'로 수정하십시오. – Praetorian

+0

예, 약간의 수정 작업이 있었지만 지금은 잘해야합니다. –

+0

const는 필요하지 않지만이 컨텍스트에서는 const이므로 포함하는 것이 좋습니다. 다시 수정 된 포인터를 "runner"로 초기화 된 복사본을 사용하도록 코드를 변경했습니다. –

0

때문에, 캐릭터 라인의 인덱스는 STR의 내용을 덮어 쓸 이유 즉, 0부터 시작합니다. 당신이 그것을 추가하기 전에 str의 모든 채워진 위치를 건너 뛰십시오.

0

문제는 함수가 전달되는 문자열의 끝을 인식하지 것입니다. 당신이 당신의 char *0 모든 년대 또는 \0을 초기화하기 위해 필요한이 문제를 해결하려면. 다른 문제는 숫자를 문자로 잘못 변환하는 것입니다. 마지막으로 문자열의 크기가 전달되지 않으므로 함수에 대해 아무 것도 안전하지 않습니다. 그래서 여러분은 먼저 충분한 공간을 할당해야합니다.

void concat(char *str, const char *ch, int num) 
{ 
    //This is function not safe since you do not 
    //know how much space str has allocated 
    str += strlen(str); 
    *str = *ch; ++str; 

    if(num < 0) 
    { 
     *str = '-';//Add the - 
     ++str; 
     num *= -1; //Make the number positive 
    } 

    //Determine the number of digits first 
    //because you need to add characters backwards 
    int digits = 0, tmpnum = num; 
    while (tmpnum) { 
     tmpnum /= 10; 
     ++digits; 
    } 

    while(digits--) 
    { 
     str[digits] = '0' + num % 10; 
     num /= 10; 
    } 
} 

사용법 :

char *runner = new char[20](); 
//or 
//char *runner = (char*)calloc(20, 1);  

concat(runner, "a", 10); 
concat(runner, "b", 20); 
concat(runner, "c", -30); 

delete [] runner; 
//or if you used calloc 
//free(runner); 

내가 한이 특히 귀하의 질문에 태그 된 것입니다 C++를 사용하여이 작업을 수행하기 쉬운/안전한 방법이 있습니다, 이것은 숙제였다 가정.