今天我遇到了一个我认为我没有完全理解的练习。这是它:
typedef struct n { char c[8]; struct n *next; } node;
nodo * f( node * x, char * s ) {
nodo * n;
if( strlen(s) > 0 ) {
n = (node *) malloc(sizeof(node));
n->next = x;
strcpy( n->c, s++ );
n->c[1] = '\0';
*(n->c) += strlen(s);
return f( n, s );
}
return x;
}
void printr( node * r ) {
if( r ) {
printf("%s", r->c);
printr( r->next );
}
}
int main() {
char p[] = "AMNG" ;
printr( f( NULL, p ) );
return 0;
}
现在我的问题都是关于第一次通话:
strcpy( n->c, s++ );
的真正含义是什么?我读它就像'获取字符串“MNG”并将其复制到n->c中。是吗?
然后我们有 n->c[1] = '\0';
使 n->c (作为字符串) "M/0 G"。
另外 *(n->c) += strlen(s);
也不清楚。我知道如果向字符添加数字会发生什么,但我对这种特定情况下的使用感到非常困惑。
感谢各位的帮助,非常感谢!
最佳答案
第一个调用 strcpy( n->c, s++ );
只是将 s
复制到 n->c
中,直到出现空字符为止找到,然后递增s
。它严格等同于
strcpy( n->c, s );
s++;
作为后递增运算符s++
返回s
在递增之前的值(与预递增相反)++s
返回增加的值)。
n->c
的内容现在为 AMNG\0
。
第二行n->c[1] = '\0'
有效地将复制的字符串缩短为1个字符长,n->c
等于A\0NG\0
作为以 null 结尾的 C 字符串,显示为 "A"
最后,*(n->c) += strlen(s)
等价于 n->c[0] += strlen(s)
,如下取消引用数组相当于访问其第一个元素,因此添加了 ASCII 编码字符 'A'
strlen(s)
,即 3 并变为 n ->c[0]
到 'D'
(参见 http://www.asciitable.com/)。
现在重复此过程,直到 s
为空并且节点向后链接,每个节点包含一个 1 字符的字符串,将 N 个字符的字符串转换为 N 个链接的节点(按相反顺序)。
关于c - C 中的一些递归、字符数组和 strcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41976791/