繁体   English   中英

C while循环条件

[英]C while loop condition

我正在为我的CS课阅读计算机系统,我遇到了令我困惑的while循环条件,这里是代码:

int parseline(char *buf, char **argv)
{
    char *delim; /* Points to first space delimiter */
    int argc; /* Number of args */
    int bg; /* Background job? */

    buf[strlen(buf)-1] = ’ ’; /* Replace trailing ’\n’ with space */
    while (*buf && (*buf == ’ ’)) /* Ignore leading spaces */
        buf++;

     /* Build the argv list */
     argc = 0;
     while ((delim = strchr(buf, ’ ’))) {
         argv[argc++] = buf;
         *delim = ’\0’;
          buf = delim + 1;
          while (*buf && (*buf == ’ ’)) /* Ignore spaces */
              buf++;
     }

while (*buf && (*buf == ’ ’)) /* Ignore spaces */ 

while循环有两个逻辑&&操作数,但我不明白第一个操作数(*buf)的用途是什么。 第二个操作数是检查空白空间,但我认为第二个操作数本身就足以满足此循环的目的。

是的, *buf &&是多余的。


*buf对于'\\0'*buf为false,对于其他所有内容为true。

*buf == ' '是真正的' '假的一切, 包括 '\\0'

以下是在功能上相同, while (buf == ' ')如果引号'改变为'

//                      v-v--- not standard quote marks.
while (*buf && (*buf == ’ ’))  

使用良好的编译器,作为具有相同代码的优化编译器,两者都不会更快。

对我来说,这只是一种迂腐的代码,确保循环不会带有空字符


代码有什么不好之处包括:

buf[strlen(buf)-1] = ' '; 如果buf[0] == 0则为UB。

buf[strlen(buf)-1] = ' '; /* Replace trailing '\\n' with space */ buf[strlen(buf)-1] = ' '; /* Replace trailing '\\n' with space */可能会删掉非'\\n'

解决前两个问题的更好的替代方案: buf[strcspn(buf, "\\n")] = '\\0';

相反,“忽略空格”的,它更类似于C忽略的空格

“构建argv列表”通常需要最终的argv[argc] == NULL

当然,这些是主要问题的侧面问题,没有更大的背景可能/可能不适用。

第二个操作数是检查空白空间,但我认为第二个操作数本身就足以满足此循环的目的。

  while (*buf && (*buf == ’ ’)) /* Ignore leading spaces */
        buf++;

这就足够了。 循环会因*buf == '\\0'而中断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM