내 문자열 길이가 일정하지만, 실제 데이터 길이는 아래 등 다양하다 (C에서)문자열 앞에 빼기 기호를 추가하는 방법은 무엇입니까? ,
" 1,54" // will be displayed as "- 1,54"
"123456789012,12" // will be dsiplayed as "- 123456789012,12"
내 문자열 길이가 일정하지만, 실제 데이터 길이는 아래 등 다양하다 (C에서)문자열 앞에 빼기 기호를 추가하는 방법은 무엇입니까? ,
" 1,54" // will be displayed as "- 1,54"
"123456789012,12" // will be dsiplayed as "- 123456789012,12"
내 요구 사항을 수행하기 위해 아래와 같은 기능을 구현했습니다. 내 문자열에 쉼표로 구분 된 두 부분 ("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
내가 그런 일 할 것 :
이 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()
하는 것을 잊지 마세요?
printf("-%f", 1.54);
그것이 첫 번째 생각 이었지만 나는 누군가가 그것을 상향 줄 것이라고 믿지 않았다. – karlphillip
@karlphillip : 최대 투표 수를 기대하지 않았습니다. 그리고 다시, 나는 종종 놀란다. 때로는 (내가 생각한) 좋은 대답은 많은 일을 완전히 무시한 채로 이루어진다. 다른 경우에는 이와 같은 명백한 단 하나의 라이너가 up-votes를 얻습니다. C'est la vie ... –
나쁜 해결책 : printf는 ','을 출력하지 않을 것입니다. 기본 로케일은 '.'만을 출력합니다. – user411313
난 의 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
나는 그것이 내 것보다 낫다는 것을 인정해야한다. +1. – Muggen
Btw, 사소한 의견, 나는 AFLIK'strlen()'이 계산에'\ 0'을 포함하지 않으므로 작은 공백을 추가하기를 원하기 때문에'strlen (num) + 3'을해야한다고 생각합니다. 왜냐하면 – Muggen
은 당신은 2 개의 문자 "-"를 추가하고 하나의 문자 만 저장할 수 있습니다. – user411313
난 당신이 공간이 인쇄되고 싶지 않아 같은데요, 그래서 :
char str[LEN] = " 1,54";
char *nid = str;
while (*nid == ' ') {
*nid = '-';
nid++;
}
printf("%s", --nid);
메신저 생 프랑스어이며, 추측, = 십진수이면 bitwise 조작과 계산을 수행하면 2의 보수가 작동합니다. 의사의
은 :
temp = 2700;
newtemp = ~temp;
newtemp = newtemp + 1; //Two's compliment
이 숙제를 냄새 ... –
@Javed 그럼에도 불구하고, 멍청한 숙제 적 –
.. 숙제가 될 것입니다! – karlphillip