2012-12-03 2 views
1

다음은 char double[] = "1.2345678";이므로 . 다음에 4 위 및 그 이후의 모든 자릿수를이 char *에 자르면 즉, "1.234"이됩니다.숯의 끝 부분 다듬기 *

+1

변수 이름으로 double을 사용하지 마십시오. 그것은 키워드입니다! – anishsane

답변

2

한 가지 확실한 해결책과 같이, NUL하여 문자를 대체하는 것입니다 : '.'

char *foo = strdup("1.2345678"); // FIXME: check return value 
foo[5] = '\0'; 

참고 정확한 위치가 다를 수 있음을, 숫자가 앞에 나타날 얼마나 많은에 depening 캐릭터. ,

char *p = foo; 
int i = 0; 
int passed_dot = 0; 
while (p && *p) { 
     if (*p == '.') passed_dot = 1; 
     if (passed_dot) i++; 
     if (i == 4) { 
       *p = '\0'; 
       break; 
     } 

     p++; 
} 

더 많은 RAM을 살 여유가없는 경우 : '.'문자열 foo 이상

으로 반복, 당신은 건너 경우 passed_dot의 상태를 변경하고, NUL 사 후 더 많은 문자를 삽입

new_str = strdup(foo); // and don't forget to check for NULL 
free(foo); 
+0

이것은 추한 것입니다. 아직도 메모리에 나머지 자릿수가 있습니다 ... –

+1

@Cobra_Fast : 좋은 힌트! 내 대답을 편집했습니다. – Philip

+0

OP는 자신의 문자열이 동적으로 할당 된 위치를 말하지 않습니다. 스택 버퍼 일 수 있습니다. 이 경우, nul을 지나서 chars 메모리를 재사용하는 현명한 방법은 없다. 문자열이 동적으로 할당 된 경우에도 원래 메모리를 확보 할 때 메모리를 절약 할 때 메모리를 절약 할 때 메모리 사용량이 동적으로 할당 될 때 메모리 사용량이 정당화되는지 여부가 의심스러운 것 같습니다. – simonc

3

'.'을 찾고 4 단계를 진행하고 문자열 종료 문자를 입력하십시오.

숫자가 점 뒤에 3 자리 미만인 경우 문자열 자판기를 직접 전달하지 마세요.

점을 쉽게 찾을 수 있도록 strchr 기능을 찾으십시오.

2

참고

: 당신은 메모리를 절약하기 위해 결과 문자열 및 free() 예전를 strdup() 수 있습니다
char * double= "1.2345678"; 

은 문자열 리터럴을 선언합니다. 이것은 const이므로 직접 수정할 수 없습니다. 변경 가능한 문자열을 얻으려면, 당신은 다른 답변에 제안 후 NUL 문자를 삽입

char double[] = "1.2345678"; 

또는

char* double = strdup("1.2345678"); 

로 선언 할 수있다.