strncpy函数的循环不被理解

strncpy函数的循环不被理解,c,if-statement,while-loop,char,strncpy,C,If Statement,While Loop,Char,Strncpy,这个循环 char *strncpy(char *dest, const char *source, size_t n) { char *start = dest; while (n && (*dest++ = *source++)) n--; // I don't understand from the code below this // I know I put'\0' at the end of dest. // But I don't know how if

这个循环

char *strncpy(char *dest, const char *source, size_t n) {
  char *start = dest;

  while (n && (*dest++ = *source++)) n--;
// I don't understand from the code below this
// I know I put'\0' at the end of dest.
// But I don't know how if (n) while (--n) works.
  if (n) while (--n) *dest++ = '\0';
  return start;
}
在条件表达式中有两个子表达式

第一个是子表达式n,它可以像n!=0

因此,如果n不等于0,则计算第二个子表达式*dest++=*source++,该表达式将指针源指向的字符复制到指针dest指向的目标数组的元素

你可以想象这个子表达式

while (n && (*dest++ = *source++)) n--;
如下操作顺序所示

(*dest++ = *source++)
表达式的结果是复制的字符的值。因此,如果复制的字符不是终止的零字符“\0”,则子表达式的逻辑值为真。否则为false,因为等于零'\0'

因此,这个循环要么复制n个字符,要么如果遇到零字符,则复制该零终止字符之前的所有字符,包括零终止字符本身


下一个循环将目标字符串追加零,直到表达式-n等于0。

该函数在处理n值时有点混淆

但是,我想你知道如果。。。{something;}有效,如果里面只有一条语句,它就不需要大括号了

( *dest = *source++, *dest++ != '\0' )
仅嵌套在if中一段时间,与以下内容完全相同:

if (n) while (--n) *dest++ = '\0';
第一个while循环最多将n个字符从源复制到目标。当n==0或*dest++=*source++的计算结果为NUL'\0'时,此循环停止,这意味着已找到源字符串的结尾


然后测试n以查看是否仍有预期的操作-即,调用方预期要复制更多的字符,但源字符串提前结束。第二个循环通过放置NUL字节、填充dest以匹配n的大小来实现这一点。

这段代码的风格决定使新开发人员难以阅读。一个快速运行通过一个美化给出了这个结果与我自己的意见补充

//获取要复制的目标字符串、源字符串和字符的大小计数 char*strncpychar*dest,const char*源,大小\u t n{ //创建指向目标字符串开头的指针 char*start=dest; //运行此循环,直到发生以下两种情况之一: //-n点击0,表示我们已经复制了所需数量的字符 //-赋值运算符“=”返回“\0”,表示我们刚刚复制 //dest中的“\0”-这意味着我们已命中源中的最后一个字符。 而n&&*dest++=*source++{ n-; } //这检查n是否还有剩余值-如果有,这意味着 //源的字符数少于要求复制的字符数 如果n{ //现在我们将检查剩余的字符并填充返回的字符串 while-n{ //将“\0”添加到返回字符串 *dest++='\0'; } } 返回启动; }
请简要描述您正在尝试做的事情。
if (n) {
   while (--n) {
      *dest++ = '\0';
   }
}