2011-02-02 3 views

답변

0

내 요구 사항을 수행하기 위해 아래와 같은 기능을 구현했습니다. 내 문자열에 쉼표로 구분 된 두 부분 ("123,54")이 있기 때문에 입력 문자열을 숫자로 변환하면 작동하지 않습니다.

static char * 
fmtsign(char * buffer) 
{ 
    char    tmpbuf[20]; 
    char    number[20]; 

    int i, len, space = 0; 

    memset(tmpbuf, 0x00, sizeof tmpbuf); 
    memset(number, 0x00, sizeof number); 

    len = (int)strlen(buffer); 

    for (i = 0; i < len; i++) 
    { 
      if (buffer[i] == ' ') 
      { 
       space++; 
      } 
      else 
       break; 
    } 

    strncpy(number, &buffer[space], len - space); 

    sprintf(tmpbuf, "- %s", number); 

    memset(buffer, 0x00, sizeof buffer); 

    strcpy(buffer, tmpbuf); 

    return (buffer); 
} 

출력 :

- 1234567,89 
    - 123,45 
     - 0,00 
0

내가 그런 일 할 것 :

str1 가정하면 이전 문자열

int strLen1 = strlen(str1); 
char * newStr = malloc(sizeof(char) *(strLen1+ 2)); 
*newStr = '-'; 
++newStr; 
strcpy(newStr , str1); 
에게 있습니다

당신은 모두 함께 strlen()을 피하기 가리키고하고 할 수

char * newStr = malloc(sizeof(str1)+1); 
*newStr = '-'; 
++newStr; 
strcpy(newStr , str1); 
,536,

그러나 sizeof(str1)이 반환 할 내용은 str1의 정의에 따라 다릅니다. 당신이 데이터를 표시 할 때 형식 문자열에 '-'

는 그냥 넣어 쉬운하지 않을까요 free()

5

하는 것을 잊지 마세요?

printf("-%f", 1.54); 
+0

그것이 첫 번째 생각 이었지만 나는 누군가가 그것을 상향 줄 것이라고 믿지 않았다. – karlphillip

+0

@karlphillip : 최대 투표 수를 기대하지 않았습니다. 그리고 다시, 나는 종종 놀란다. 때로는 (내가 생각한) 좋은 대답은 많은 일을 완전히 무시한 채로 이루어진다. 다른 경우에는 이와 같은 명백한 단 하나의 라이너가 up-votes를 얻습니다. C'est la vie ... –

+0

나쁜 해결책 : printf는 ','을 출력하지 않을 것입니다. 기본 로케일은 '.'만을 출력합니다. – user411313

4

의 sprintf()이 경우를 사용하여 제시한다. 공백 뒤에 기호, 다음 수 - 모든 시작의 공백 만 1. 을해야합니다 그 방법을 폐기 그래서

에게 코드를 업데이트했습니다. 일부 코드와 함께 코드에 몇 가지 주석을 남겼습니다. 원할 경우 printf() 코드를 디버깅하는 데 도움이됩니다.

#include <stdio.h> 

int main() 
{ 
    char* num = " 1,54"; 

    int c = 0; 
    if (strlen(num) > 0) 
    { 
     c = num[0]; // Safely storing the first character. Is it a whitespace? 
    } 
    else 
    { 
     printf("String is empty!\n"); 
     return -1; 
    } 

    int wspace_count = 0; // number of whitespaces detected 
    while (c == 32) // ASCII 32 = whitespace 
    { 
     c = num[wspace_count]; 
     if (c == 32) 
      wspace_count++; 
    } 

    //printf("whitespaces detected: %d\n", wspace_count); 
    //printf("total chars in num: %d\n", strlen(num)); 

    int chars_to_copy = strlen(num) - wspace_count+1; // +1 becouse you want to leave 1 whitespace there, right? 
    //printf("chars_to_copy: %d\n", chars_to_copy); 

    int tmp_size = chars_to_copy + 1; // another +1 becouse you need to append '\0' at the end 
    char* tmp = malloc(tmp_size); 
    int pos = wspace_count - 1; 
    strncpy(tmp, &num[pos], chars_to_copy); 
    tmp[strlen(tmp)] = '\0'; // add '\0' at the end 

    //printf("tmp = \"%s\" \n", tmp); 

    char* result = (char*) malloc(strlen(tmp) + 3); // 1 byte for the - sign, 1 for the space after it, 1 for the '\0' at the end 
    sprintf(result, "- %s", tmp); 

    printf("%s\n", result); 

    return 0; 
} 

출력 :

- 1,54 
+0

나는 그것이 내 것보다 낫다는 것을 인정해야한다. +1. – Muggen

+0

Btw, 사소한 의견, 나는 AFLIK'strlen()'이 계산에'\ 0'을 포함하지 않으므로 작은 공백을 추가하기를 원하기 때문에'strlen (num) + 3'을해야한다고 생각합니다. 왜냐하면 – Muggen

+0

은 당신은 2 개의 문자 "-"를 추가하고 하나의 문자 만 저장할 수 있습니다. – user411313

0

난 당신이 공간이 인쇄되고 싶지 않아 같은데요, 그래서 :

char str[LEN] = "   1,54"; 
char *nid = str; 
while (*nid == ' ') { 
    *nid = '-'; 
    nid++; 
} 
printf("%s", --nid); 
0

메신저 생 프랑스어이며, 추측, = 십진수이면 bitwise 조작과 계산을 수행하면 2의 보수가 작동합니다. 의사의

은 :

temp = 2700; 
newtemp = ~temp; 
newtemp = newtemp + 1;  //Two's compliment 
관련 문제