-1
#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:lowercase 函数将 getline cin 作为输入而不是将其视为数组

4

3 回答 3

3

问题肯定出在您的阅读方式上。 scanf("%d",&t); 不消耗返回字符,所以它仍然在 getline 上,这将得到一个空刺。将其更改为 scanf("%d\r",&t)。

于 2013-07-22T20:27:23.477 回答
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 >>orscanf或其他之后,如果您接下来要做的是阅读该行的其余部分,则您想忽略该前导换行符。执行此操作的 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;
}
于 2013-07-22T20:27:28.777 回答
-1

或者干脆使用 <boost/algorithm/string.hpp> 头文件和函数 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;
}
于 2013-07-22T20:24:09.480 回答