我正在为我的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)
的目的是什么。第二个操作数是检查空格,但我认为第二个操作数本身就足以满足此循环的目的。
答案 0 :(得分:3)
是的,*buf &&
是多余的。
*buf
, '\0'
为false,对其他所有内容均为true。
*buf == ' '
适用于' '
,其他所有内容均为false,包括 '\0'
。
答案 1 :(得分:1)
如果引号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 */
可能会失去非'\n'
。
解决前两个问题的更好选择:buf[strcspn(buf, "\n")] = '\0';
而忽略<#34;忽略空格&#34;,忽略 white-spaces 更像C-like。
&#34;构建argv列表&#34;通常需要最终argv[argc] == NULL
。
当然,这些是主要问题的侧面问题,没有更大的背景可能/可能不适用。
答案 2 :(得分:1)
第二个操作数正在检查空白区域,但我会这么认为 第二个操作数本身就足以满足于此目的 循环。
while (*buf && (*buf == ’ ’)) /* Ignore leading spaces */
buf++;
这就足够了。循环将中断*buf == '\0'
。