使用字符串数组作为函数参数
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 string
s(即你想在 vector
容器中存储一些 string
s)你可以简单地组合这些STL class 模板如下:
std::vector<std::string> strings;
要将其传递给 functions/methods,请使用通常的 C++ 规则,即:
- 如果函数是观察字符串数组(不修改它),使用常量引用传递(
const &
): vector<string> &
- 如果函数确实修改向量的内容,您可以使用非常量引用传递(
&
): vector<string> &
我打算编写一个程序,它只会从用户输入的内容中删除单个字母,假设我们有一些文本,例如:"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 string
s(即你想在 vector
容器中存储一些 string
s)你可以简单地组合这些STL class 模板如下:
std::vector<std::string> strings;
要将其传递给 functions/methods,请使用通常的 C++ 规则,即:
- 如果函数是观察字符串数组(不修改它),使用常量引用传递(
const &
):vector<string> &
- 如果函数确实修改向量的内容,您可以使用非常量引用传递(
&
):vector<string> &