在包含字符串的 typedef 结构中使用指针

Use of pointers in a typedef struct which contains a string of characters

我想编写一个名为 "substitution" 的函数作为参数传递:

  1. 一个链表"l",每个节点都有一个字符("lchar")。
  2. 一串字符"CHG"
  3. 一个字符"CH"
  4. 包含最终字符串的 "vec" 结构。

函数每次扫描链表上的每个字符,并将链表中与作为参数传递的字符CH不同的字符写入"vec",但是当它扫描到确切的CH时链表上的字符,它在 "vec" 上写入字符串 "CHG".

下面是我的课本给出的解法。整体程序好像看懂了,但是函数扫描字符CH时的那段话看不懂:

svec->v[cur]='[=11=]'; 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]='[=10=]';
            strcat(svec->v,CHG);
            cur=cur+strlen(CHG);
            l=l->next;
        }
    }
    svec->v[cur]='[=10=]';
    return 1;
}
svec->v[cur]='[=10=]'; strcat(svec->v,CHG);

这会将 svec->v char* 上 [cur] 位置的 char 替换为终止空字节,以便在其上使用 strcat。

来自 man strcat :

The strcat() function appends the src string to the dest string, overwriting the terminating null byte ('[=12=]') at the end of dest, and then adds a terminating null byte.

如果 strcat 的 "dest char *" 缺少终止空字节,则 strcat 行为不可预测。它作为一种安全。

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

之所以这样写,是因为"svec"和"l"是指针,因此,您需要对它们进行引用才能访问它们的数据。

希望对您有所帮助!