c - C 中的一些递归、字符数组和 strcpy

标签 c arrays pointers recursion

今天我遇到了一个我认为我没有完全理解的练习。这是它:

    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/

相关文章:

c - 按 "b=(a+b)-(a=b);"进行交换是否安全?

c - 仅使用位运算的整数左侧连续的个数

c++ - 数组在 C++ 函数中有垃圾值!

C#对象和C++对象,区别

c - 使用 while 循环的简单程序出现段错误,但扩展时没有错误。如何?

c - 根据\n 将字符数组分成多个部分

c - 为什么使用指针到指针会出现内存访问冲突错误

C++ - 基类的面向对象数组

c++ - 尝试将二维数组作为参数传递时 undefined reference

c - 悬挂指针示例混淆