Как я могу заполнить переменную Char справа налево? - PullRequest
0 голосов
/ 11 ноября 2019

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

Моя проблема заключается в следующем:

Я запрограммировал ключ в TPV, который инициализируетпродажа. Это печатает тег «Введите цену» и char с именем «цена», который инициализируется как «00,00 €»

Это просто. Теперь я хотел бы заполнить этот ценовой символ справа налево, т.е.:

  • Нажатие "1": сделает цену: 00,01 €
  • Следующее число («2»): 00,12 €
  • Далее («3»): 01,23 €
  • (...): 123,45 €
  • (. ..): 123456,78 €
  • и т.д ...

Этот ценовой символ используется с динамической памятью с использованием таких функций, как calloc и realloc, которые резервируют память для каждогонажата новая клавиша.

Пока это код, на данный момент я просто хочу реализовать эту функциональность.

char * precio = "00,00€";
int j;

while(1){      //Loop that waits for the sale to be initialized
    UpdateStatusbar(fontClock);
    if (!XuiHasKey()) {
            continue;
    }
    key = XuiGetKey();
    if (key == XUI_KEYUP) {
        j = sizeof(precio) - 2;

        //Position of the last element of precio (-2) to avoid the characters '\0' and '€'

        precio = (char *) calloc(4, sizeof(char));
        precio = (char *) realloc(precio, sizeof(char) + sizeof('\0'));

        (Irrelevant code for printing the: "Type the price")
        while (key != XUI_KEYENTER && key != XUI_KEYCANCEL) {

                UpdateStatusbar(fontClock);
                if (!XuiHasKey()) {
                    continue;
                }
                key = XuiGetKey();

                if (key == XUI_KEYCLEAR) {
                    if (j > 0) {
                        j--;
                        precio[j] = '\0';
                    }
                } //Function to delete as the backspace in your keyboard

                else if (key != 'e') {
                    if(strcmp(precio, "0000") == 0){
                        precio[j] = KeyToChar(key);
                    }else {
                        for (int i = 1; i < j; ++i) {
                            precio[i-1] = precio[i];
                            precio[j] = KeyToChar(key);
                        }
                    }
//This key !='e' comes for the function KeyToChar(). 'e' means Key is not a number  

                }
                precio = (char *) realloc(precio,
                        (j + 1) * sizeof(char) + sizeof('\0'));

                XuiCanvasDrawText(XuiRootCanvas(), 10, 180, 20, font,
                        XUI_TEXT_NORMAL, colorMsgFg, precio);

        } //End While
     } //End if for precio  
}//End While

Как вы можете видеть, я использую некоторые специальные библиотеки (XUI), предоставленныеизготовителем TPV

Если потребуется дополнительная информация, попросите ее, и я верну ее

1 Ответ

0 голосов
/ 11 ноября 2019

и символ с именем "цена", который инициализируется как "00,00 €"

При нажатии "1": цена будет равна: 00,01 €

Просто используйте целое число и конвертируйте его в строку для каждого нового введенного символа.

Я написал код ниже примерно за 15 минут, но не запускал его. Ошибки и опечатки ожидаются. Я использовал unsigned long long, чтобы разрешить ввод не менее 9 223 372 036 854 775 806 центов. Я использовал snprintf для вычисления необходимого количества символов, затем выделил память с помощью malloc и затем снова вывел строку с помощью snprintf. Я предположил, что символ не является чем-то особенным и правильно обрабатывается вашим компилятором / окружением.

#include <limits.h>
#include <stdio.h>
#include <stddef.h>
#include <stdint.h>
#include <assert.h>
#include <stdlib.h>

/**
 * Get's the price as a string.
 * @param the state variable that get's updated with each number
 * @param Should be the newly inputted character or 0 on clear
 *        TODO: refactor to 2 functions
 * @return an allocated pointer or NULL on error
 *         TODO: pass a pointer to that pointer and use realloc to save free call
 *           or preferably just allocate a buffer big enough on stack 
 *           like `char buf[log10(ULLONG_MAX) + sizeof(",€")]`, which shouldn't be that big actually
 */
char *price_update(unsigned long long *state, int new_char) {
   if (new_char == 0) {
      *state = 0;
   } else {
      if (!('0' <= new_char && new_char <= '9')) goto ERROR_EINVAL;
      if (ULLONG_MAX / 10 > *state)  goto ERROR_OVERFLOW;
      *state *= 10;
      const int to_add = new_char - '0';
      if (ULLONG_MAX - to_add > *state) goto ERROR_OVERFLOW;
      *state += to_add;
   }
   const int count = snprintf(NULL, 0, "%02lld,%02lld€", *state / 100, *state % 100);
   char *price = malloc(count + 1);
   if (price == NULL) goto ERROR_MALLOC;
   snprintf(price, count + 1, "%02lld,%02lld€", *state / 100, *state % 100);
   return price;
// TODO: implement your favorite solution to error handling
ERROR_OVERFLOW:
ERROR_EINVAL:
ERROR_MALLOC:
    return NULL;
}

/**
 * Clears the price
 */
char *price_clear(unsigned long long *state) {
    return price_get(state, 0);
}

// usage
unsigned long long state = 0;
int main(){
 while (1) {
     some_unrelated_code();
     int key = XuiGetKey();
     char *price = key == KEY_CLEAR ? price_clear(&state) : price_get(&state, key);
     if (price == NULL) { /* handle error */ abort(); }
     do_something_with_price(price);
     free(price); 
  }
}
...