【问题标题】:Adding spaces at the beginning of an array of chars在字符数组的开头添加空格
【发布时间】:2016-04-08 06:12:25
【问题描述】:

如标题所示,我需要使用字符数组在某个单词的开头添加用户指定数量的空格。我需要在一个函数中执行此操作,该函数将我的数组作为参数并返回它。这是我的代码:

#include <iostream>

using namespace std;

void writeDownCharArray(char t[], int sizee)
{
    for (int i=0;i<sizee;i++)
    {
        cout<<t[i];
    }
}

char * addSpaces(char t[], int ammountOfSpaces)
{
    int numberOfCharacters=0;
    for (int i=0; t[i]!=NULL; i++){numberOfCharacters++;} //checking the amount of characters in my array
    char t2[numberOfCharacters+10];
    for (int i=0; i<ammountOfSpaces; i++) {t2[i]=' ';} //adding the sapces
    for (int i=ilosc;i<numberOfCharacters+ammountOfSpaces;i++) {t2[i]=t[i-ammountOfSpaces];} //filling my new array with characters from the previous one
    return t2;
}

int main()
{
    int numberOfSpaces;
    char t[10];
    cout << "Text some word: ";
    cin.getline(t,10);
    cout<<"How many spaces?: ";cin>>numberOfSpaces;
    writeDownCharArray(addSpaces(t, numberOfSpaces), HERE);
    return 0;
}

现在:如何将其打印到屏幕上?如果我说cout&lt;&lt;addSpaces(t, numberOfSpaces); 它实际上会在屏幕上打印一些奇怪的东西(不是数字,只是奇怪的字符)。如果我说writeDownCharArray,那我应该在“这里”的地方放什么?

【问题讨论】:

  • 为什么不使用std::string 让自己的生活更轻松?
  • 当前 C++ 中没有可变长度数组。您也不应该从函数中返回本地数组。
  • @EdHeal,我想,这是一个家庭作业。
  • 你不应该返回对局部变量(t2)的引用。
  • @SergeyA:几乎相同(t2 衰减为指针),OP 最后得到了悬空指针。

标签: c++ arrays char add spaces


【解决方案1】:

解决此问题的 C++ 方法是使用 std::string 类似

std::string add_spaces(const std::string & line, std::size_t number_of_spaces)
{
    std::string spaces(number_of_spaces, ' ');
    return spaces + line;
}

如果您不能使用std::string,那么您将不得不处理动态内存分配和更改

char t2[numberOfCharacters+10];

char * ts = new char[numberOfCharacters + ammountOfSpaces + 1];

我们必须这样做,因为可变长度数组不是标准的,尝试返回指向函数中声明的数组的指针会留下一个悬空指针,并且尝试使用它是未定义的行为。

由于函数中使用了new[],因此您需要记住在完成后返回的指针上调用delete[]。这是使用 std::string 的另一个好处,因为它会自行处理。

writeDownCharArray 而言,您不需要大小参数,因为cout 可以处理空终止的c 字符串。你可以简单地拥有

void writeDownCharArray(char t[])
{
    cout<<t;
}

然后你的主要看起来像

char * foo = addSpaces(t, numberOfSpaces);
writeDownCharArray(foo);
delete [] foo;

【讨论】:

  • 在不知道课程具体要求的情况下,我建议给以下签名std::unique_ptr&lt;char[]&gt; addSpaces(char*, size_t)。动态内存管理学了没问题,但不妨开始好好学习一下
  • 好的。想通了,也许我不会受到惩罚,如果我用一根绳子做的话。那么如何在 main() 中调用这个函数呢? @Edit,哎呀,明白了。非常感谢!已经投票了
  • @Chad 这是个好建议。我一直忘记unique_pt可以这样使用。
  • 还有一个问题。其实两个。关于 add_spaces 函数参数。第一:为什么使用“&”而不是“*”,或者什么都不用(有效),第二:为什么使用 size_t 而不是 int? (int 也可以)
  • @Frynio 因为line 从未被修改过,传递std::string 可能会很昂贵,它应该由const &amp; 使用。这样就不会进行复制,并且您向调用者保证您不会更改字符串。我使用了size_t,因为这是字符串大小的基础,size_t 可能大于int
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
相关资源
最近更新 更多