Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的Getline函数+;正在将第一个输入作为空字符。它应该这样做吗?_C++_Getline - Fatal编程技术网

C++ C+中的Getline函数+;正在将第一个输入作为空字符。它应该这样做吗?

C++ C+中的Getline函数+;正在将第一个输入作为空字符。它应该这样做吗?,c++,getline,C++,Getline,从第一个输出行看,它似乎将空字符作为第一个字符串。也正因为如此,它缺少了它应该作为输入的最后一个字符串。我可能会错过使用getline的机会,但我不确定,如果有任何帮助,我将不胜感激 int main() { short int t,i; cin>>t; string a; while(t–) { getline(cin,a); cout<<"length of string is "<<

从第一个输出行看,它似乎将空字符作为第一个字符串。也正因为如此,它缺少了它应该作为输入的最后一个字符串。我可能会错过使用getline的机会,但我不确定,如果有任何帮助,我将不胜感激

int main() {
    short int t,i;
    cin>>t;
    string a;
    while(t–)
    {
        getline(cin,a);
        cout<<"length of string is "<<a.length()<<endl;
        for(i=0;i<a.length()/2;i+=2)
        { 
            cout<<a[i];
        }
        cout<<endl;
    }
    return 0;
}  
intmain(){
短int t,i;
cin>>t;
字符串a;
而(t–)
{
getline(cin,a);

cout在执行了
cin>>t;
之后,缓冲区仍然包含换行符序列。然后
getline()
读取一个立即换行符,这会使它误以为用户只按了enter键,而没有键入任何内容


为了解决这个问题,您需要在调用
getline()

之前忽略换行符,在执行
cin>>t;
之后,缓冲区仍然包含换行符序列。然后
getline()
读取一个即时换行符,这会使它误以为用户只需按enter键而不键入任何内容


为了解决这个问题,您需要在调用
getline()

之前忽略换行符。当您调用
cin>>t
时,它在到达非数字字符时停止读取,因此它将在
cin
的缓冲区中保留换行符
读取该换行符并返回一个空白字符串

因此,您需要:

  • 调用
    cin.ignore()
    后调用
    cin>>t
    删除该换行符:

    #include <string>
    #include <iostream>
    #include <limits>
    
    int main()
    {
        short int t;
    
        std::cin >> t;
        std::cin.ignore(std::numeric_limits<std::streamize>::max(), '\n'); // <-- add this!
    
        while (t-– > 0)
        {
            std::string a;
            std::getline(std::cin, a);
            std::cout << "length of string is " << a.length() << std::endl;
            for (std::string::size_type i = 0; i < (a.length() / 2); i += 2)
            { 
                std::cout << a[i];
            }
    
            std::cout << std::endl;
        }
    
        return 0;
    }
    

当您调用
cin>>t
时,它在到达非数字字符时停止读取,因此它在
cin
的缓冲区中保留换行符。随后的
std::getline()
读取该换行符并返回一个空白字符串

因此,您需要:

  • 调用
    cin.ignore()
    后调用
    cin>>t
    删除该换行符:

    #include <string>
    #include <iostream>
    #include <limits>
    
    int main()
    {
        short int t;
    
        std::cin >> t;
        std::cin.ignore(std::numeric_limits<std::streamize>::max(), '\n'); // <-- add this!
    
        while (t-– > 0)
        {
            std::string a;
            std::getline(std::cin, a);
            std::cout << "length of string is " << a.length() << std::endl;
            for (std::string::size_type i = 0; i < (a.length() / 2); i += 2)
            { 
                std::cout << a[i];
            }
    
            std::cout << std::endl;
        }
    
        return 0;
    }
    

在执行
cin>>t;
之后,缓冲区仍然包含新行序列,然后由
getline()
读取。请查看右侧的相关问题。在执行
cin>>t;
之后,缓冲区仍然包含新行序列,然后由
getline()读取
。看一看右边的相关问题。你打算使用这条新线吗?你会怎么做?@machine\u 1查看
cin.ignore()的文档
。我很确定这个问题以前在堆栈溢出问题上已经得到了回答。我已经解释了这个问题,建议你现在再做一些搜索。你是想使用换行符吗?你会怎么做?@machine\u 1查看
cin.ignore()的文档
。我很确定这个问题以前在堆栈溢出问题上已经得到了回答。我建议您在我解释了这个问题之后再进行一些搜索。
#include <string>
#include <iostream>
#include <limits>

int main()
{
    short int t;

    std::cin >> t;
    std::cin.ignore(std::numeric_limits<std::streamize>::max(), '\n'); // <-- add this!

    while (t-– > 0)
    {
        std::string a;
        std::getline(std::cin, a);
        std::cout << "length of string is " << a.length() << std::endl;
        for (std::string::size_type i = 0; i < (a.length() / 2); i += 2)
        { 
            std::cout << a[i];
        }

        std::cout << std::endl;
    }

    return 0;
}
#include <string>
#include <iostream>
#include <sstream>

int main()
{
    short int t;
    std::string a;

    std::getline(std::cin, a);
    std::istringstream(s) >> t;

    while (t-– > 0)
    {
        std::getline(std::cin, a);
        std::cout << "length of string is " << a.length() << std::endl;
        for (std::string::size_type i = 0; i < (a.length() / 2); i += 2)
        { 
            std::cout << a[i];
        }

        std::cout << std::endl;
    }

    return 0;
}