在包含字符串的 typedef 结构中使用指针
Use of pointers in a typedef struct which contains a string of characters
我想编写一个名为 "substitution" 的函数作为参数传递:
- 一个链表"l",每个节点都有一个字符("lchar")。
- 一串字符"CHG"
- 一个字符"CH"
- 包含最终字符串的 "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"是指针,因此,您需要对它们进行引用才能访问它们的数据。
希望对您有所帮助!
我想编写一个名为 "substitution" 的函数作为参数传递:
- 一个链表"l",每个节点都有一个字符("lchar")。
- 一串字符"CHG"
- 一个字符"CH"
- 包含最终字符串的 "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"是指针,因此,您需要对它们进行引用才能访问它们的数据。
希望对您有所帮助!