Добавить к строке в C - PullRequest
       0

Добавить к строке в C

0 голосов
/ 29 ноября 2011

Итак, у меня есть строка, которая будет иметь следующий грубый формат: string # more than one string here.

Что я хочу сделать, так это удалить все после #. Как бы я это сделал? Кроме того, что, если я просто хочу сохранить исходную строку и взять все после пробела и #?

У меня есть следующий код, но очевидно, что добавление чего-либо в строку NULL не работает должным образом:

char *inst_ptr содержит всю строку.

char *lbl = NULL;
int len = 0;
size_t inst_len = strlen(inst_ptr);
for (int t = 0; t < inst_len; t++) {

    if (inst_ptr[t] == '#')
        break;

    else {
        printf("len %d\n", len);
        lbl[len] = inst_ptr[t];
        lbl[len+1] = '\0';
        len = strlen(lbl);
    }
}

EDIT:

Предположим, у меня есть следующая строка: loop # hello world!

Я просто хочу извлечь loop в другую строку. То, что я делаю выше, это наличие lbl в виде строки NULL и выполнение цикла по исходной строке. Пока символ не #, я просто «добавляю» символ с нулевым терминатором, как показано выше.

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

Возможно, вы должны проверить раздел 7.21 в стандарт для вдохновения.

Лучший подход зависит от остальной части вашего приложения.Если вас не интересуют исходные данные, вы можете просто использовать

strtok(inst_ptr, "#");

. Или лучше выделить и скопировать только те данные, которые вам нужны:

char * temp = strchr(inst_ptr, '#');
char * lbl;

if (temp)
   lbl = strndup(inst_ptr, temp - inst_ptr);
else
   lbl = strdup(inst_ptr);

Обратите внимание, что вышеизложенное - это минимальные реализации, о которых я всегда думал, не обязательно лучшие.

1 голос
/ 29 ноября 2011

Во-первых, вы делаете

char *lbl = NULL;

Тогда вы делаете

lbl[len]

Вы пытаетесь разыменовать указатель NULL и вызываете неопределенное поведение.

Во-первых, вам необходимо выделить память для этой строки (calloc выделяет память и устанавливает все это на 0, что избавит от необходимости вручную добавлять нулевой терминатор):

char *lbl = calloc(inst_len + 1, 1);

Тогда вам нужно исправить петлю, некоторые вещи находятся не в том месте. Должно быть

for (int t = 0; t < inst_len; t++) {
    if (inst_ptr[t] == '#') {
        len = t - 1; // strlen(lbl) is redundant
        break;
    } else
        lbl[t] = inst_ptr[t];
}

Затем, когда вы закончите, free выделенная вами память, чтобы не вызвать утечку памяти:

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