【问题标题】:C - Splitting C-String into words without reallocating memoryC - 将 C 字符串拆分为单词而不重新分配内存
【发布时间】:2017-05-10 15:02:05
【问题描述】:

我正在尝试将字符串 (const char*) 拆分为单词并将单个单词保存在 char-pointer (char**) 数组中。

我的问题不是拆分部分,而是我不允许分配任何内存。我需要使用输入字符串作为我的记忆,但由于它是一个 const char* 我无法修改它。

我急切的想法是将所有空格更改为'\ 0'并将单词开头的位置保存在数组中,这当然是不可能的,因为输入字符串是const。

函数的声明如下所示:

int breakIntoWords(const char *line, int maxWords, char** words);

函数返回line中的单词数,ma​​xWords是单词数组的大小。

我发现的所有内容要么使用数组作为输入字符串,要么使用 malloc 分配内存。

【问题讨论】:

  • 您可以保存代表单词的索引/指针对。
  • 当然可以,@VittorioRomeo,但这不会让您获得包含单个单词的 C 字符串。
  • but that does not get you C strings 没有C strings,只有字符数组(当然字符串文字除外)。
  • array of char-pointer (char**). ==>> char** 不是数组,也不是字符指针数组。它只是一个指向 char 的指针。
  • @JohnBollinger 不知何故这是我的观点。这是 SO 而不是学习系统,我认为人们应该遵守标准。

标签: c arrays string


【解决方案1】:

所提出的问题没有解决方案。您可以获得指向每个单词开头的指针,但是为了将源字符串用作单独单词字符串的存储空间,您必须按照您考虑的那样通过用字符串终止符替换分隔符来修改它。

如果任务确实假设您将更改输入行以将其用于存储多个单独的字符串,那么将函数的line 参数设置为const-qualified 似乎本质上是不正确的。这种资格与该职能应执行的工作不一致。此外,如果您应该将指向line 指向的字符串的指针分配给words,那么words不是const-qualified 的事实也会产生冲突。

对于所描述的问题,我认为唯一可行的解​​决方案是从 line 参数中删除 const 限定符。

【讨论】:

  • 如果我删除 const 修饰符,我仍然会遇到同样的问题,因为每当我使用引号时,我都可以使用自动生成的 const char* 调用该函数?
  • @Treborium,我将“将字符串 [...] 拆分为单词”和“保存单个单词”解释为需要生成 C 字符串(以空字符结尾的字符序列, Michi) 一个词,你提出的实现思想确实支持。在那种情况下,正如我所说,对问题的限制使它变得棘手。所以是的,删除const 会将问题变成另一个问题。特别是,它把它变成了一个solvable的。你是对的,生成的函数在字符串文字上使用是不安全的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 1970-01-01
  • 2011-06-12
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多