【问题标题】:Dynamically allocated strings in CC中动态分配的字符串
【发布时间】:2014-11-10 03:10:06
【问题描述】:

我在UVa's online judge 中做一个相对简单的字符串问题来练习字符串,因为我在 C 中一直很难使用它们。问题基本上是检查字符串 B 是否包含另一个字符串 A 如果你删除'clutter' 并连接剩余的字符,例如,如果 "ABC" 包含在 "AjdhfmajBsjhfhC" 中,在这种情况下是正确的。

所以,我的问题是如何有效地为我不知道其长度的字符串分配内存?我所做的是使字符串非常大char Mstring[100000],从输入中读取,然后使用strlen(Mstring) 将字符串复制到适当大小的字符数组中。类似的东西:

char Mstring[100000];

scanf("%s",Mstring);
int length = strlen(Mstring);
char input[length+1]={0};
for(int i = 0; i<length;i++){
    input[i]=Mstring[i];
}

在 C 中是否有更好/标准的方法来做到这一点?我知道 C 对字符串的支持不是很好,如果在 C 中没有更好的方法,也许在 C++ 中?

【问题讨论】:

  • 我应该添加c++标签吗?
  • 仅当您使用 C++ 并接受仅适用于 C++ 的答案时。
  • 听起来任务是让你自己弄清楚,而不是在网上问。
  • 是的,那没关系,但我更喜欢在 C 中工作的答案,如果可能的话,也许可以在 C++ 中使用另一种方法,但我不想在同一篇文章中提出单独的问题这就是为什么我不确定添加 c++ 标签的原因,我想我会的。
  • char input[length + 1] = {0};.

标签: c++ c string


【解决方案1】:

如果您可以选择使用 C++(如您所提到的),那将使您的生活更轻松。然后,您可以使用为您管理动态大小的字符串的 STL 字符串 (std::string)。您也可以放弃旧的 scanf() 野兽并使用 std::cin。

例子:

#include <iostream>
#include <string>

void main()
{
    std::string sInput;
    std::getline(std::cin, sInput);

    // alternatively, you could execute this line instead:
    // std::cin >> sInput;
    // but that will tokenize input based on whitespace, so you
    // will only get one word at a time rather than an entire line
}

描述如何管理可以在 C 中动态增长的字符串将需要更多的解释和关注,听起来你真的不需要那个。但是,如果是这样,这里是一个起点:http://www.strchr.com/dynamic_arrays

【讨论】:

  • 谢谢!是的,它在 C++ 中没问题,但如果知道如何在 C 中做到这一点也很好,我会检查链接。检查阵列是否需要更大不会降低性能?你知道std::string是怎么做到的吗?
  • 简而言之,像 std::string 这样的类会在构造函数中使用 malloc(X) 分配一个默认大小为 X 的数组。当它需要扩展以容纳更多内容时,它使用 realloc(Y) 来扩展分配空间的大小并保留原始内容。如果它认为有必要,它也可以使用 realloc(Z) 来缩小它的空间。
猜你喜欢
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 2018-01-29
  • 1970-01-01
  • 2015-07-14
  • 2011-10-21
  • 1970-01-01
相关资源
最近更新 更多