хранение символов в типе данных char языка C - PullRequest
0 голосов
/ 02 июня 2010

Я могу хранить строки небольшой длины в типе данных char.

Но когда это превышает его емкость, что может быть альтернативным способом хранения строки.

Я использую тип данных char.

void setString(char* inPoints)
{
if (strcmp(mPoints, inPoints)!= ZERO) {

    if (mPoints) {

        free(mPoints);
    }

    mPoints = (char*)malloc((strlen(inPoints) + 1)  * sizeof(char));

    strcpy(mPoints, inPoints);
}
}

Ответы [ 4 ]

3 голосов
/ 02 июня 2010

Вы можете выделить новый, больший массив и скопировать в него старую строку (и удалить старую, чтобы предотвратить утечки памяти), добавив больше символов. Или (если возможно) переключиться на строковый класс C ++, что облегчает этот процесс.

2 голосов
/ 02 июня 2010

realloc () должен изменить размер вашей строки

0 голосов
/ 02 июня 2010
  • strcmp с mPoints = NULL не допускается.
  • Ноль как константа?
  • free () принимает указатели NULL.
  • malloc () не нуждается в приведении к C.
  • sizeof (char) равно 1.
  • Всегда проверяйте возвращение malloc ().

Модифицированная версия:

void setString(char* inPoints)
{
    if ((mPoints == NULL) || (strcmp(mPoints, inPoints) != 0)) 
    {
        free(mPoints);

        mPoints = malloc(strlen(inPoints) + 1);

        if (mPoints != NULL)
        {
            strcpy(mPoints, inPoints);
        }
    }
}

И вы используете глобальную переменную mPoints, есть лучшие решения. Но это и обработка ошибок для malloc () = NULL в стороне, вы всегда выделяете необходимую сумму, так что именно вы подразумеваете под "превышает его емкость"?

0 голосов
/ 02 июня 2010

Использование strncpy вместо strcpy обычно безопаснее, но здесь вы каждый раз выделяете необходимый объем памяти, необходимый для хранения inPoint в mPoint, поэтому я не вижу смысла. Максимальная длина строки, которую вы можете сохранить в mPoint, ограничена объемом памяти, которую можно разместить.

Добавить : вы можете realloc как предложено, и, скорее всего, вы можете добавить проверку длины, чтобы избежать перераспределения, если строка короче; таким образом, mPoint всегда может содержать строки меньше самой длинной из встреченных строк или равную:


// somewhere altogether with mPoints
size_t mPointsCurrenStorage = INITVAL;
// e.g. INITVAL is 256, and you pre-malloc-ate mPoints to 256 chars
// ... in the func
size_t cl = strlen(inPoints);
if ( cl >= mPointsCurrentStorage ) {
  mPoints = realloc(mPoints, cl+1);
  mPointsCurrentStorage = cl+1;
}
strcpy(mPoints, inPoints);

таким образом, хранилище только растет ...

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