Как добавить знак минус перед строкой? (В С) - PullRequest
0 голосов
/ 02 февраля 2011

Моя длина строки постоянна, но фактическая длина данных будет меняться, как показано ниже,

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

Ответы [ 6 ]

5 голосов
/ 02 февраля 2011

Разве не было бы проще просто поставить '-' в строке формата при отображении данных?

printf("-%f", 1.54);
4 голосов
/ 02 февраля 2011

Я предлагаю использовать sprintf () в этом случае.

I обновил код, чтобы он отбрасывал все пробелы в начале, но 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 голосов
/ 03 февраля 2011

Я реализовал функцию ниже, чтобы выполнить мое требование.Преобразование входной строки в число не работает для меня, так как моя строка состоит из двух частей («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 голосов
/ 02 февраля 2011

я предполагаю, что это французский и, = десятичный, если это так, тогда нужно выполнить побитовую манипуляцию и вычисление дополнения к двум.

в псевдокоде:

temp = 2700;
newtemp = ~temp;
newtemp = newtemp + 1;      //Two's compliment
0 голосов
/ 02 февраля 2011

Полагаю, вы не хотите печатать пробелы, поэтому:

char str[LEN] = "          1,54";
char *nid = str;
while (*nid == ' ') {
    *nid = '-';
    nid++;
}
printf("%s", --nid);
0 голосов
/ 02 февраля 2011

Я бы сделал что-то подобное:

Предполагая, 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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...