【问题标题】:how to index a string in C like a string in python?如何像python中的字符串一样索引C中的字符串?
【发布时间】:2020-02-17 19:07:48
【问题描述】:

例如,在python中,你可以像这样索引字符串

some_string = "hello"
substring = some_string[0:3]

子字符串将是“hel”

但是,在 C 中,如果我有

char some_string[] = {'h', 'e', 'l', 'l', 'o'};

有没有办法得到只是

{'h', 'e', 'l'}

我可能忽略了一个非常简单的解决方案,但有时我发现很难用两种语言思考。

【问题讨论】:

  • 请注意,您的some_string 不是 C 字符串。它缺少空终止符。

标签: python c string substring c-strings


【解决方案1】:

不是很简单,主要是因为内存管理。您要么需要 substring 成为一个包含足够多字符的数组,要么需要动态分配内存。例如:

char *some_string = "hello";
char substring[4];
strncpy(substring,some_string,3);
substring[3]='\0';

或:

char *substring(char *s, int start, int len)
{
    char *s2= malloc(len+1);
    strncpy(s2, s+start, len);
    s2[len]='\0';
    return s2;
}

【讨论】:

  • 注意:您还需要检查start <= strlen(s))。 (加:strncpy() 在这里毫无意义。(很少这样做))
  • @wildplasser,建议替代strncpy
  • 也许只是 strcpy() 甚至 memcpy() ?
  • @wildplasser, strcpy() 不会这样做,因为可能需要复制字符串结尾。 memcpy() 可以。 strncpy() 有什么问题?
【解决方案2】:

首先声明一个字符数组

char some_string[] = {'h', 'e', 'l', 'l', 'o'};

不包含字符串。

你应该写任何一个

char some_string[] = {'h', 'e', 'l', 'l', 'o', '\0'};

char some_string[] = {"hello"};

char some_string[] = "hello";

获取子字符串的唯一方法是将子范围的字符复制到另一个字符数组中。

例如

#include <string.h>

// ...

char substring[4];

strncpy( substring, some_string, 3 );
substring[3] = '\0';

【讨论】:

  • 我会考虑在这里使用memcpy 而不是strncpy
  • @ChristianGibbons 通常,复制的字符串可能小于请求的范围。
  • 这在一般情况下是正确的,但我得到的印象是我们正在处理一个我们知道要复制的子字符串是全长的场景。特别是考虑到 OP 正在寻找它等同于在 python 字符串中给出一个范围。
猜你喜欢
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 2015-08-24
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多