2011-02-02 8 views
0

私の文字列の長さは、私はそのような何かをするだろう、一定の実際のデータ長が以下のようなとして変化する文字列の前にマイナス記号を追加する方法は? (Cで)

"   1,54" // will be displayed as "- 1,54" 
"123456789012,12" // will be dsiplayed as "- 123456789012,12" 
+1

は宿題を匂い... –

+2

@Javedはそれにもかかわらず、これまで –

+0

...宿題愚かな宿題だろう! – karlphillip

答えて

0

。入力文字列を数値に変換するのは、私の文字列がカンマで区切られた2つの部分( "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); 

しかし、sizeof(str1)が返すものは、str1の定義方法によって異なります。あなたがデータを表示する際のフォーマット文字列に - 「」

はそれだけで配置する最も簡単なことではないかfree()

5

に忘れてはいけないのですか?

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

それは最初の考えだったが、誰かがそれをアップヴォートするとは思わなかった。 – karlphillip

+0

@karlphillip:私はアップの投票も期待していませんでした。それではまた、私はしばしば驚いています - 時には(私が思った通りに)多くの仕事を取った良い答えは完全に無視されます。他の時には、このような明白な1ライナーがアップ・ボートを獲得する。 C'est la vie ... –

+0

bad solution: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つの文字 " - "を追加し、1つのスペースしか持たない。 – user411313

0

私はあなたがスペースをプリントアウトしたくない推測しているので:

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

イムはTHIはフランス語で、推測、 = 10進数ならビット単位の操作と計算を行い、2の補数は機能するはずです。擬似コードで

:私は私の要件を実行するために機能の下に実装しました

temp = 2700; 
newtemp = ~temp; 
newtemp = newtemp + 1;  //Two's compliment 
関連する問題