C设置字符串等于substring

Aus*_*tin 11 c string substring

在C中,如果我有:

char *reg = "[R5]";
Run Code Online (Sandbox Code Playgroud)

而且我要

char *reg_alt = "R5" (相同的东西,但没有括号),我该怎么做?

我试过了

*char reg_alt = reg[1:2];
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

das*_*ght 15

没有用于处理类似子串的内置语法,因此您需要手动复制内容:

char res[3];
memcpy(res, &reg[1], 2);
res[2] = '\0';
Run Code Online (Sandbox Code Playgroud)


Pet*_*ter 13

我建议您需要阅读C上的基本文本,而不是假设其他语言的技术才有效.

首先,char *reg = "[R5]";不是一个字符串.它是一个指针,初始化为指向字符串文字("[R5]")的第一个字符(即其值是地址).

其次,reg_alt也是一个指针,而不是一个字符串.分配给它将包含某个地址.字符串不是C中的一等公民,因此赋值运算符不适用于它们.

第三,1:2没有指定范围 - 它实际上是更无效的语法.是的,我知道其他语言.但不是C.因此我的评论,你不能假设C将允许它像其他语言一样.

如果要从另一个字符串中获取子字符串,有多种方法.例如;

  char substring[3];
  const char *reg = "[R5]";    /* const since the string literal should not be modified */

  strncpy(substring, &reg[1], 2);     /* copy 2 characters, starting at reg[1], to substring */
  substring[2] = '\0';     /*  terminate substring */

  printf("%s\n", substring);
Run Code Online (Sandbox Code Playgroud)

strncpy()在标准标题中声明<string.h>.需要终止子字符串,因为printf() %sformat会查找零字符以标记结尾.

  • 没有`memcopy()`或`strncopy()`这样的东西.`strncpy()`将检测字符串上的零终结符,并停止复制.如果源字符串短于指定的长度,它也将停止复制.`memcpy()`将无论如何复制 - 如果源字符串短于指定长度,将导致未定义的行为. (5认同)
  • @Austin:另一方面,你需要知道`strncpy()`... 1)用空字节填充剩余空间,即*总是*写完整的'n`字节,而2)将如果源字符串的第一个"n"字节中没有空字节,则保留目标**未终止**.这样一来,这是一个棘手的功能. (2认同)