我遇到了一个问题,我已经将一段大小写代码移动到它自己的函数中,因为我想不止一次地调用它。如果留在主体中它可以正常工作,但是一旦我将其称为自己的函数,它就不会将第二个输入的第一个字大写。如果我多次调用该函数,则会对所有后续输入发生这种情况。我认为我的上一个变量存在问题,但我不确定。
using namespace std;
string capitalize(string capitalizeThis)
{
getline(cin, capitalizeThis);
for_each(capitalizeThis.begin(), capitalizeThis.end(), [](char & c) {
static int last = ' ';
if (last == ' ' && c != ' ' && isalpha(c))
c = ::toupper(c); //capitalize if conditions fulfilled
last = c; //iterate
});
return capitalizeThis;
}
int main()
{
string eventName, customerName;
cout << "\nPlease enter your name:" << endl;
customerName = capitalize(customerName);
cout << customerName << endl;
cout << "\nPlease enter the name of your event:" << endl;
eventName = capitalize(eventName);
cout << eventName << endl;
cout << endl << endl;
system("pause");
return (0);
}
我的输出如下:
Please enter your name:
my name
My Name
Please enter the name of your event:
this event
this Event
Press any key to continue . . .
答案 0 :(得分:1)
最后一个值通过函数调用持续存在,因为它是一个静态变量。这意味着每次调用都使用前一次调用中的最后一个字符的值。您可以每次更改它以捕获新变量:
string capitalize(string capitalizeThis)
{
getline(cin, capitalizeThis);
char last = ' ';
for_each(capitalizeThis.begin(), capitalizeThis.end(), [&last](char & c)
{
if (last == ' ' && c != ' ' && isalpha(c))
c = ::toupper(c); //capitalize if conditions fulfilled
last = c; //iterate
});
return capitalizeThis;
}
在旁注中,您按价值传递string capitalizeThis
。您无法更改函数中传递的字符串的值,因此通过从main
传递字符串您没有做任何事情。
你应该在main中读取输入并通过引用将它传递给函数(因为函数应该一次做一件事):
void capitalize(string &capitalizeThis)
{
char last = ' ';
for_each(capitalizeThis.begin(), capitalizeThis.end(), [&last](char & c)
{
if (last == ' ' && c != ' ' && isalpha(c))
c = ::toupper(c); //capitalize if conditions fulfilled
last = c; //iterate
});
}
从main
int main()
{
string eventName, customerName;
cout << "\nPlease enter your name:" << endl;
getline(cin, customerName);
capitalize(customerName);
cout << customerName << endl;
...
}
答案 1 :(得分:0)
自attributedText
初始化为last
以来,您的功能首次正常运行。使其适用于后续调用的一种方法:
' '