簡體   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