#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作为输入而不是将其视为数组
答案 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;
}