Использование указателей в структуре typedef, которая содержит строку символов - PullRequest
0 голосов
/ 19 января 2019

Я хочу написать функцию под названием «замена», которая передает параметры:

  1. связанный список «l», в котором есть символ на каждом узле («lchar»).
  2. строка символов "CHG"
  3. символ "CH"
  4. структура "vec", содержащая последнюю строку.

Функция сканирует каждыйвремя от времени в связанном списке и записывает в "vec" символы связанного списка, которые отличаются от символа CH, переданного в качестве параметра, но когда он сканирует точный символ CH в связанном списке, он записывает в "vec"строка" CHG ".

Ниже приводится решение, данное в моем учебнике.Кажется, я понимаю общую программу, но не могу понять отрывок, когда функция сканирует символ CH:

svec->v[cur]='\0'; strcat(svec->v,CHG);

Что именно она делает?Почему мы используем указатели для "svec"?Почему написано svec->v[cur]=l->lchar;, поскольку мы обрабатываем строку символов?

Решение:

struct el {
    struct el *next;
    char lchar;
};
struct el *l=NULL;

typedef struct {
    int size;
    char *v;
} vec;
vec svec;

int substitution (struct el *l, char *CHG, char CH, vec *svec) {
    \\ initialize svec in the dynamic memory
    int cur=0;
    while (l!=NULL) {
        if (l->lchar !=CH) {
            svec->v[cur]=l->lchar;
            cur++;
            l=l->next;
        } else {
            svec->v[cur]='\0';
            strcat(svec->v,CHG);
            cur=cur+strlen(CHG);
            l=l->next;
        }
    }
    svec->v[cur]='\0';
    return 1;
}

1 Ответ

0 голосов
/ 19 января 2019
svec->v[cur]='\0'; strcat(svec->v,CHG);

Это заменяет char в позиции [cur] на svec-> v char * завершающим нулевым байтом, чтобы использовать на нем strcat.

From man strcat:

Функция strcat () добавляет строку src к строке dest, перезаписывая завершающий нулевой байт ('\ 0') в конце dest, а затем добавляет завершающий нулевой байт.

Если "dest char *" в strcat отсутствует завершающий нулевой байт, поведение strcat непредсказуемо.Он служит в качестве защиты.

 svec->v[cur]=l->lchar;

Это написано так, потому что "svec" и "l" являются указателями, поэтому вам необходимо использовать их для доступа к их данным.

Надеюсь, поможет !

...