Как использовать snprintf вместо strcpy в этой ситуации? - PullRequest
0 голосов
/ 16 апреля 2020
void put(char* key, int value)
{
int i = 0;

// Iterate through elements of hashtable
while (array[i].flag == 1)
{
    // If key already exists, update the value
    // and return
    if (strcmp(array[i].data->key, key) == 0)
    {
        array[i].data->value = value;
        return;
    }

    i = i + 1;

    // Error Handling, when end of hashtable is reached
    if (i == max)
    {
        i = 0;
        // p rintf("\n Hash table is full, cannot insert any more item \n");
        // return;
    }
}

// Insert new item into the hashtable
array[i].flag = 1;

array[i].data = (struct item*) malloc(sizeof(struct item));
array[i].data->key = (char *)malloc((strlen(key)+1)*sizeof(char));
// so here I have to use snprintf instead of strcy because it's
// forbidden, and I don't know how
**strcpy(array[i].data->key, key);**
//snprintf(array[i].data->key,sizeof(key),"%s",key);

array[i].data->value = value;
}

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

здесь я должен использовать snprintf вместо strcy, потому что это запрещено, и я не знаю, как

strcpy() может переполниться, если место назначения недостаточно. Это действительно не применимо здесь, поскольку выделено необходимое пространство.

// array[i].data = (struct item*) malloc(sizeof(struct item));
// array[i].data->key = (char *)malloc((strlen(key)+1)*sizeof(char));
// strcpy(array[i].data->key, key);

array[i].data = malloc(sizeof *(array[i].data));
size_t sz = strlen(key) + 1;
array[i].data->key = malloc(sz);
snprintf(array[i].data->key, sz, "%s", key);
// or 
strcpy(array[i].data->key, key);
// or 
memcpy(array[i].data->key, key, sz);
  1. Приведение не требуется

  2. размер ссылочных данных лучше используйте этот тип sizeof.

  3. Избегайте 2 поездок, определяющих длину.

  4. Возвращает проверку, опущенную для краткости.


С проверками

array[i].data = malloc(sizeof *(array[i].data));
if (array[i].data == NULL) return fail; // or do something to indicate error

size_t sz = strlen(key) + 1;
array[i].data->key = malloc(sz);
if (array[i].data->key == NULL) return fail;

int count = snprintf(array[i].data->key, sz, "%s", key);
if (count < 0 || (unsigned) count >= sz) return fail;

Основная ошибка

Попытка OP не удалась, поскольку sizeof(key) является размером указатель , возможно, 2, 4 или 8. Вместо этого необходим размер выделения для array[i].data->key, как в sz (см. выше) или strlen(key) + 1.

snprintf(array[i].data->key,sizeof(key),"%s",key); // bad
0 голосов
/ 16 апреля 2020

Во-первых, никогда не приводите malloc, и не забудьте проверить возвращаемое значение malloc.

array[i].data = malloc(sizeof(struct item));
if (!array[i].data) {
    // handle error
    return; // for example
}

array[i].data->key = malloc((strlen(key)+1)*sizeof(char));
if (!array[i].data->key) {
    // handle error
}

Используя strlen вместо sizeof, который возвращает размер указателя, а не длина строки:

snprintf(array[i].data->key, strlen(key) + 1,"%s", key);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...