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/