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
?)@JoachimPileborgcmdline[-1]
与*((cmdline)+(-1))
相同。如果这不是很好的定义,那么你怎么能从指针中减去呢?--
运算符是否也生成UB?NULL
是一个空指针常量。空字符'\0'
是另一回事。我同意#1;但这并不是cmdline为#2设置的内容。请参见问题中的“我的编辑”以获得澄清。
char str[100] = "hello world";
char *cmdline = str + 10;