目前尚不清楚是否需要 + 1
:
int len = strlen(TARGET);
info = malloc( len + 1 );
因为它上面几行已经附加了它:
TARGET[END - START] = '\0';
如果需要,那么也许..需要附加\0
。
int len = strlen(TARGET);
info = malloc( len + 1 );
strcpy(info, TARGET);
info[len] = '\0';
问:如何判断字符串是否已包含
null termination
也许如果它已经拥有它......附加另一个就不是逻辑。
全功能:
char * FUNCTION ( char * v ){
char *TARGET = NULL;
const char *PATTERN1 = "co=";
const char *PATTERN2 = "&";
char *START = strstr(v, PATTERN1);
if (START) {
START = START + strlen(PATTERN1);
char *END = strstr(START, PATTERN2);
if (!END){
END = START + strlen(START);
}
TARGET = malloc(END - START + 1);
memcpy(TARGET, START, END - START);
TARGET[END - START] = '\0';
}
if (!START || TARGET == NULL || TARGET[0] == '\0') {
return 0;
}
int len = strlen(TARGET);
info = malloc( len + 1 );
strcpy(info, TARGET);
info[len] = '\0';
return info;
}
答案 0 :(得分:5)
如何确定字符串是否已经具有空终止
嗯,根据定义,“字符串”以空值终止。否则,它不是字符串。
引用C11
,章节§7.1.1
字符串是连续的字符序列由第一个空格终止并包括 字符。 [....]
从理论的角度来看,生产者而不是消费者的责任是确保应该用作字符串的字符数组的空终止。
也就是说,strlen()
返回字符串的长度,没有null-terminator。因此,如果您要使用现有字符串的strlen()
的返回值来为其副本分配内存,则需要为空终止符分配一个额外的再见,因此+1
是必需的将大小传递给分配器函数。
答案 1 :(得分:3)
strlen
计算字符串中包含\0
的字符数,但不包括"hello"
,因此您永远不会计算它。因此,例如,如果您的字符串为strlen
,则其\0
将为5.所以是的,您总是需要在其长度上添加1以说明x <- list(c("tom", "bob", "red"), c("jin", "tonic"), list(c("megan", "tina"), "carl"), "tim", list(c("chris", list(c("stella", "mia", "charly"))), "jack"))
# flatten list
x2 <- paste0(lapply(x, function(y) paste0("(", paste0(y, collapse = ","), ")")), collapse = ",")
# remove unwanted characters
x2 <- gsub('\"|c|list| ', "", x2)
x2 <- paste0("(", x2, ");")
# remove brackets from single term list object
library(stringr)
x3 <- str_replace_all(x2, "\\([a-z]*\\)", function(x) gsub("^\\(|\\)$", "", x))
# plot
library(ape)
plot(read.tree(text = x3))
端。
答案 2 :(得分:1)
以下内容:
sizeof(TARGET)
不会给你\0
;它只计算第一个TARGET
之前的字符数。因此,如果"a\0bcd"
包含'a'
,它只会给你1( info = malloc( len +1 );
)。
以下内容:
+ 1
需要为字符串和空终止符分配足够的字节,因此strcpy(info, TARGET);
是必需的。
以下内容:
'\0'
会复制字符,直到遇到第一个'\0'
,然后它会追加'\0'
,因此目标中必须有足够的空间用于{{1 }}