【问题标题】:C while loop conditionC while 循环条件
【发布时间】:2018-03-12 06:20:40
【问题描述】:

我正在为我的 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 == NULL 会发生什么?我尝试使用 buf == NULL 运行简化版本的代码并出现段错误,因为据我猜测,循环条件试图尊重 NULL 指针。在循环条件中有一个指针是不好的编程习惯吗?是否应该使用带有标志条件的循环?
  • buf 在此之后不能是NULLbuf = delim + 1;

标签: c while-loop


【解决方案1】:

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


*buf'\0' 为假,而对其他一切为真。

*buf == ' '' ' 为真,对其他所有东西都为假,包括 '\0'

【讨论】:

  • 另一种方法:(*buf && (*buf == ’ ’)):当*buf==' ' 第一个条件也为真时,它是多余的
【解决方案2】:

如果将引号更改为',则以下功能与while (buf == ' ')相同。

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

使用好的编译器,两者都不会像发出相同代码的优化编译器那样快。

对我来说,这只是确保循环不使用 null 字符的迂腐代码。


代码的坏处包括:

如果buf[0] == 0buf[strlen(buf)-1] = ’ ’; 是 UB。

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

解决上述两个问题的更好选择:buf[strcspn(buf, "\n")] = '\0';

与“忽略空格”不同,忽略空格更像是 C。

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

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

【讨论】:

    【解决方案3】:

    第二个操作数是检查空白,但我认为 第二个操作数本身就足够了 循环。

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

    这就够了。对于*buf == '\0',循环会中断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 2020-10-30
      • 2018-06-23
      • 2016-10-08
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多