如何在字符串前添加减号? (在C中)

时间:2011-02-02 16:57:37

标签: c string formatting

我的字符串长度是常量,但实际数据长度将如下所示变化,

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

6 个答案:

答案 0 :(得分:5)

在显示数据时,在格式字符串中放一个' - '不是最容易吗?

printf("-%f", 1.54);

答案 1 :(得分: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

答案 2 :(得分: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()

答案 3 :(得分:0)

我猜你不想打印空格,所以:

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

答案 4 :(得分:0)

我猜你是法国人,= =十进制,如果是这样,那么按位操作和计算这两个补码应该有效。

伪代码中的

temp = 2700;
newtemp = ~temp;
newtemp = newtemp + 1;      //Two's compliment

答案 5 :(得分: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