• 以下代码示例中 if (cmdline[-1] == '\n' && cmdline[-1] == '\0') 的用途是什么?
  • 这什么时候会评估为真?
  • cmdline[-1] 中的负索引在这里是如何工作的?我在 SO 上看到过类似的问题,但这里事先没有指针算法。

  • 这是它来自的伪代码:
    parseInfo *parse (char *cmdline) {
      parseInfo *Result;
      char command[MAXLINE];
      int com_pos = -1;
    
      if (cmdline[-1] == '\n' && cmdline[-1] == '\0')
        return NULL;
    
      Result = malloc(sizeof(parseInfo));
      init_info(Result);
      com_pos=0;
      /*  while (cmdline[i] != '\n' && cmdline[i] != '\0') { */
    
      command[com_pos]='\0';
      parse_command(command, 0); /* &Result->CommArray[Result->pipeNum]);*/
    
      return Result;
    }
    

    编辑#1:
    为什么“什么时候不打印?”在以下情况下打印:
    编辑 #2:我通过将长度增加 1(包括空字符)并将 cmdline 字节复制到 length malloc 的字节来使 length 成为有效字符串。
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void parse(char *cmdline) {
      printf("'%c'\n", cmdline[-1]);
      if (cmdline[-1] == '\0' || cmdline[-1] == '\n') {
        printf("When does this NOT get printed?\n");
      }
    }
    
    int main() {
      char str[100] = "hello";
      const int length = strlen(str) + 1;
      char *cmdline = malloc(length * sizeof(char));
      strncpy(cmdline, str, length);
      parse(cmdline);
      return 0;
    }
    

    带有相应的输出:
    $ gcc -v
    Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
    Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
    Target: x86_64-apple-darwin14.3.0
    Thread model: posix
    $ gcc negative_index.c
    $ ./a.out
    ''
    When does this NOT get printed?
    

    最佳答案

  • 不,char 不能同时是 \n\0 ,代码可能意味着
    使用 || 而不是 &&
  • 例如:
    char str[100] = "hello world";
    char *cmdline = str + 10;
    

    那么 cmdline[-1]str[9] 相同。
  • 关于C 中的字符可以既是换行符又是 NULL 终止符吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30009992/

    10-11 21:59