C while循环条件

C while循环条件,c,while-loop,C,While Loop,我正在为我的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] = ’ ’; /* Replac

我正在为我的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&&
是多余的


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


*buf='
'
是真的,而对其他一切都是假的,包括
'\0'

以下功能与
相同,而(buf='
如果引号
'
更改为

//                      v-v--- not standard quote marks.
while (*buf && (*buf == ’ ’))  
有了一个好的编译器,这两种方法都不如发出相同代码的优化编译器快

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


该代码的缺点包括:

buf[strlen(buf)-1]=''是UB

buf[strlen(buf)-1]='';/*将尾随的“\n”替换为空格*/
可能会删除非“\n”

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

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

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

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

第二个操作数是检查空格,但我认为 第二个操作数本身就足以实现此目的 循环


这就足够了。循环将因另一种方法而中断:
(*buf&&(*buf='')
:当
*buf=''
第一个条件也是真的,所以它是多余的。如果buf==NULL会发生什么?我试着运行一个buf==NULL的简化版本的代码,但得到了一个seg错误,因为据我猜测,循环条件试图遵从NULL指针。在循环条件中有指针是一种糟糕的编程实践吗?是否应该使用带有标志条件的循环?
buf
在此之后不能为
NULL
buf=delim+1
//                      v-v--- not standard quote marks.
while (*buf && (*buf == ’ ’))  
  while (*buf && (*buf == ’ ’)) /* Ignore leading spaces */
        buf++;