使用字符串数组作为函数参数

Using string array as function argument

我打算编写一个程序,它只会从用户输入的内容中删除单个字母,假设我们有一些文本,例如:"monkey eat banana",我们应该删除字母 'a'从上面的文字。

最终输出应该是这样的: 'monkey et bnn'

我的代码可以完美地处理单个字符串,但我必须使用 getline() 函数来获取一些更长的文本,这就是为什么我必须声明字符串数组,以便通过它的大小在 getline() 函数的第二个参数中,如下所示:

string text[256]; 
getline(text, 256); 

我想在不给出数组大小的情况下使用 getline() 函数,但我认为这是不可能的,因此我需要坚持使用字符串数组而不是字符串。

我遇到的问题是我不知道如何正确传递字符串数组,以将其用作函数的参数。这是我的代码;

#include <iostream> 
#include <string> 

using namespace std; 

void deleteLetter(string &text[], char c) 
{ 
   size_t positionL = text.find(c); 
   if(positionL == string::npos) 
      cout << "I'm sorry, there is no such letter in text" << endl; 
   else 
      text.erase(positionL, positionL); 
      cout << "After your character removed: " << text << endl; 
} 

int main() 
{ 
   string str1[256]; 
   char a = 'a'; 
   cin.getline(str1, 256); 

   deleteLetter(str1, a); 
} 

我知道这是基本的东西,但我仍然无法自己弄明白。 Perhpahs 我应该寻求你的帮助。

在我看来您不需要字符串数组。只是为了将用户键入的尽可能多的字符读入一个字符串。 getline 应该可以很好地处理这个问题。

int main() 
{ 
    std::string str1; // just a string here, not an array.
    std::getline (std::cin,str1);

    deleteLetter(str1, 'a'); 
} 

现在您应该更改 DeleteLetter 的签名以将单个字符串作为参数。

void deleteLetter(std::string& text, char c);

您将如何实施 deleteLetter 是另一个问题。按照你的方式,它只会删除 'a'.

的第一次出现

要从控制台输入 (cin) 读取 string,您可以使用 getline() 函数:

std::string line;
std::getline(std::cin, line);

要从字符串中删除所有出现的给定字母,您可以使用所谓的 erase-remove idiom,结合 string::erase() 方法和 std::remove() 算法。
(请注意,这个成语通常显示为 std::vector,但不要忘记 std::string 也可以被视为 "container of characters" 存储按顺序,类似于 vector,所以这个成语也可以应用于 string 内容。)

要将 std::string 传递给 functions/methods,请使用通常的 C++ 规则,即:

  • 如果函数是观察字符串(不修改它),使用常量引用传递:const std::string &
  • 如果函数修改字符串的内容,你可以使用非常量引用传递:std::string &

一个简单的可编译代码如下:

#include <algorithm>
#include <iostream>
#include <string>
using namespace std;

//
// NOTE:
// Since the content of 'text' string is changed by the
// removeLetter() function, pass using non-const reference (&).
//
void removeLetter(string& text, char letter)
{
    // Use the erase-remove idiom
    text.erase(remove(text.begin(), text.end(), letter), 
               text.end());
}

int main()
{
    string line;
    getline(cin, line);
    cout << "Read string: " << line << endl;

    removeLetter(line, 'a');
    cout << "After removing: " << line << endl;
}

这是我用 MSVC 得到的:

C:\Temp\CppTests>cl /EHsc /W4 /nologo test.cpp
test.cpp

C:\Temp\CppTests>test.exe
monkey eats banana
Read string: monkey eats banana
After removing: monkey ets bnn

从你的问题中我不太清楚你是否也想传递字符串向量(可能在你代码的其他部分)...

无论如何,如果你想要 vector of strings(即你想在 vector 容器中存储一些 strings)你可以简单地组合这些STL class 模板如下:

std::vector<std::string> strings;

要将其传递给 functions/methods,请使用通常的 C++ 规则,即:

  • 如果函数是观察字符串数组(不修改它),使用常量引用传递(const & ): vector<string> &
  • 如果函数确实修改向量的内容,您可以使用非常量引用传递(& ): vector<string> &