C中的一个字符可以同时是换行符和空终止符吗? 在以下代码示例中,if(cmdline[-1]='\n'&&cmdline[-1]='\0')的用途是什么? 什么时候这才算是真的 cmdline[-1]中的负索引在这里是如何工作的?我在这方面也见过类似的问题,但这里事先没有指针算法

C中的一个字符可以同时是换行符和空终止符吗? 在以下代码示例中,if(cmdline[-1]='\n'&&cmdline[-1]='\0')的用途是什么? 什么时候这才算是真的 cmdline[-1]中的负索引在这里是如何工作的?我在这方面也见过类似的问题,但这里事先没有指针算法,c,string,C,String,以下是它来自的伪代码: 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);

以下是它来自的伪代码:

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(包括空字符)并将
length
字节复制到
length
malloc'd字节中,使
cmdline
成为有效字符串

#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;
}
  • 不,字符不能同时是
    \n
    \0
    ,代码的意思可能是 使用
    |
    而不是
    &&
  • 例如:

    char str[100] = "hello world";
    char *cmdline = str + 10;
    
    然后
    cmdline[-1]
    str[9]
    相同


  • cmdline[-1]='\n'&&cmdline[-1]='\0'
    始终为false。我想它应该是
    |
    而不是
    &
    ?您最好想想负数组索引会做什么。(提示:数组索引通常是
    size\u t
    ,这通常与
    无符号long
    相同,
    -1
    作为
    无符号long
    ?)@JoachimPileborg
    cmdline[-1]
    *((cmdline)+(-1))
    相同。如果这不是很好的定义,那么你怎么能从指针中减去呢?
    --
    运算符是否也生成UB?
    NULL
    是一个空指针常量。空字符
    '\0'
    是另一回事。我同意#1;但这并不是cmdline为#2设置的内容。请参见问题中的“我的编辑”以获得澄清。
    char str[100] = "hello world";
    char *cmdline = str + 10;