多个输入的C ++大写功能失败

时间:2017-08-31 19:20:59

标签: c++ visual-c++

我遇到了一个问题,我已经将一段大小写代码移动到它自己的函数中,因为我想不止一次地调用它。如果留在主体中它可以正常工作,但是一旦我将其称为自己的函数,它就不会将第二个输入的第一个字大写。如果我多次调用该函数,则会对所有后续输入发生这种情况。我认为我的上一个变量存在问题,但我不确定。

    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 . . .

2 个答案:

答案 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以来,您的功能首次正常运行。使其适用于后续调用的一种方法:

  1. 将其移出lambda函数。
  2. 重置其值。
  3. ' '