【问题标题】:Avoid adding another '\0' if string already has one?如果字符串已经有一个,避免添加另一个 '\0'?
【发布时间】:2017-07-14 07:08:21
【问题描述】:

不清楚这里是否需要+ 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';

Q:如何判断一个字符串是否已经有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;
}

【问题讨论】:

  • "如何判断一个字符串是否已经有空终止符" 如果字符串不是空终止符,你就不能使用strlen
  • @FelixPalmen 嘿,我不确定其他问题,但这看起来是一个合理的问题(不过我不判断质量)。
  • 恐怕这里可能存在错误的身份危机。
  • 我的帖子被这些无效的 cmets 控制了。
  • 花时间发布答案的人们正在遭受损害。对OP没有造成损害。海报的目的是解决问题。

标签: c string strlen


【解决方案1】:

如何判断一个字符串是否已经有空终止符

嗯,一个“字符串”,根据定义,是空终止的。否则,它不是一个字符串

引用C11,第 7.1.1 章

字符串是连续的字符序列以第一个 null 结尾并包括 特点。 [....]

从理论上讲,生产者而不是消费者有责任确保应该用作字符串的字符数组的空终止。


也就是说,strlen() 返回一个 字符串 的长度,不带空终止符。因此,如果您要使用现有字符串的strlen() 的返回值为其副本分配内存,则需要为空终止符分配一个额外的再见,因此在传递大小时需要+1分配器函数。

【讨论】:

    【解决方案2】:

    strlen 计算字符串中有多少个字符,直到\0 除外,所以你永远不会计算它。例如,如果你的字符串是"hello",那么它的strlen 就是5。所以是的,你总是需要在它的长度上加1 来说明最后的\0

    【讨论】:

    • if strlen returns a correct value, the string is null-terminated for sure...欢迎来到 UB 的世界。
    • 既然你这么说,似乎很明显。我删除了那部分。
    【解决方案3】:

    以下内容:

    int len = strlen(TARGET);
    

    不会给你sizeof(TARGET);它只会计算第一个 \0 之前的字符数。所以,如果 TARGET 包含 "a\0bcd" 它只会给你 1(对于 'a')。

    以下内容:

     info = malloc( len +1 );
    

    需要为字符串加上空终止符分配足够的字节,所以+ 1是必须的。

    以下内容:

    strcpy(info, TARGET);
    

    将复制字符直到遇到第一个'\0'然后它会附加一个'\0',因此目标中必须有足够的空间用于'\0'

    【讨论】:

      猜你喜欢
      • 2011-10-19
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 2017-07-02
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多