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

时间:2015-01-19 20:04:20

标签: c++ arrays string function

我的意思是编写程序,它只是删除用户输入的单个字母,让我们说我们有一些文字如:"猴子吃香蕉"我们应该删除这封信' 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我应该伸出援助之手。

2 个答案:

答案 0 :(得分:2)

听起来像你不需要一串字符串。只需读取用户键入的字符数即可。 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&amp; text,char c);

你将如何实现deleteLetter是另一个问题。你拥有它的方式,它只会删除第一次出现'a'。

答案 1 :(得分:1)

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

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

要从字符串中删除给定字母的所有匹配项,您可以使用所谓的erase-remove idiom,并结合使用string::erase()方法和std::remove()算法。 /> (请注意,此惯用法通常会显示应用于std::vector,但请勿忘记std::string也可以被视为&#34;字符容器&#34; < / em>按顺序存储,类似于vector,因此这个习惯用法也可以应用于string内容。)

要将std::string传递给函数/方法,请使用通常的C ++规则,即:

  • 如果函数是观察字符串(不修改它),请使用 const引用const std::string &
  • 如果该函数修改字符串的内容,您可以使用非const引用传递: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 string(即你想在string容器中存储一些vector),你可以简单地组合这些STL类像这样的模板:

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

要将其传递给函数/方法,请使用通常的C ++规则,即:

  • 如果函数是观察字符串数组(不修改它),则使用 const references const &)传递:vector<string> & < / LI>
  • 如果该功能修改矢量内容,您可以使用非常量参考&)传递:vector<string> & < / LI>