在C ++中转换为小写

时间:2013-07-22 20:14:45

标签: c++ string lowercase

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include <string>   
#include <algorithm>

using namespace std;

string A,B;

int main()
{
    int t,l,i;
    scanf("%d",&t);
    while(t--)
    {
        std::string str;
        std::getline(cin, str);
        std::transform(str.begin(), str.end(), str.begin(), ::tolower);
        cout<<str;
        /*for(i=0;i<s.length();i++)
        {
            s[i]=toupper(s[i]);
        }*/
    }

    return 0;
}

我编写此代码以转换为小写,但在使用输入

的ideone上运行时
1
hola please!!!

它显示输出没有你可以告诉或更正它这将帮助我学习使用std:小写函数将getline cin作为输入而不是将其视为数组

3 个答案:

答案 0 :(得分:3)

问题肯定在于你的阅读方式.scanf(“%d”,&amp; t);不消耗返回字符,因此它仍然存在于getline上,这将获得空的刺痛。将其更改为scanf(“%d \ r”,&amp; t)。

答案 1 :(得分:3)

如果简化代码,问题可以简化为:

int main() {
    int t;
    scanf("%d",&t);
    std::string str;
    std::getline(cin, str);
    std::cout<<str;
}

这是因为scanf从输入读取,直到它到达不匹配的字符,并将该字符留在输入缓冲区中。您输入的内容为“1\nhola please!\n\0”,因此scanf会读取1,剩下的就是“\nhola please!\n\0”。然后,你告诉它读取,直到找到下一个\n,这是立即,所以它返回一个空字符串。

解决方案是:在使用std::cin >>scanf或其他任何内容之后,如果您想要做的下一件事是阅读该行的其余部分,则您希望忽略该前导换行符。 C ++的方法是std::cin.ignore(0xFFFFFFFF,'\n');,它将忽略该行的其余部分。或者,使用scanf("%d\n" &t);使scanf读取换行符。

相关,您永远不会检查任何输入的有效性:

int main() {
    int num_lines=0; //variables on different lines and initialized
    std::cin >> num_lines
    if (!std::cin) 
        return 1;
    std::string str;
    for(int j=0; j<num_lines && std::getline(sd::cin, str); ++j) {
         std::transform(str.begin(), str.end(), str.begin(), ::tolower);
         std::cout << str;
    } 
    return 0;
}

答案 2 :(得分:-1)

或者只是使用&lt; boost / algorithm / string.hpp&gt;标头和函数boost :: to_lower()。

int t = 0;
scanf("%d",&t);
std::cin.ignore();
while(t--) {
  std::string str;
  std::getline(cin, str);
  boost::to_lower(str);
  std::cout << str << std::endl;
}