为什么cin.getline()跳过每一行的第一个单词?

时间:2011-03-06 05:01:16

标签: c++ cin

我试图逐行显示命令行输入文本文件的文本。但由于某种原因,它会在第一行之后跳过每行中的第一个单词。

代码:

using std::cout;  
using std::cin;  
using std::endl;  

int main (int args, char* argv[])  
{   
 char x[100];  
 char y[100];  
 char z[100];  
 cin.getline(x,100) >> argv[2];  
 cin.getline(y,100) >> argv[2];  
 cin.getline(z,100) >> argv[2];  
 cout << x <<endl;  
 cout << y <<endl;  
 cout << z <<endl;  
 return 1;  
}  

正在运行./a.out< moby.txt 显示这个:

CHAPTER 1. Loomings. 

me Ishmael. Some years ago--never mind how long precisely--having  
or no money in my purse, and nothing particular to interest me on

但是moby.txt中的前三行是:

CHAPTER 1. Loomings.

Call me Ishmael. Some years ago--never mind how long precisely--having  
little or no money in my purse, and nothing particular to interest me on

代码省略“呼叫”和“小” 我觉得这是一个\ n错误,但我不知道如何解决它。 提前感谢您的帮助。

4 个答案:

答案 0 :(得分:5)

cin.getline(x,100) >> argv[2];

您将一行(或该行的前99个字符)读入x。然后你跳过任何空格并将下一个单词读入argv[2]。第一句话就是在那里结束。

您为什么使用>> argv[2]?你有什么可能尝试用这个? argv[2]可能不存在,即使它存在,您也无法控制argv[2]指向的字符数组的大小,因此超出该数组的可能性非常高。

不要直接使用char数组,而是使用std::getlinestd::string来读取std::string个对象的行:以这种方式编写正确的代码要容易得多。例如,

std::string x;
if (!std::getline(std::cin, x)) {
    // handle input error
}

答案 1 :(得分:1)

@James McNellis已经指出了基本问题。我的建议是:

  1. 请勿使用getline
  2. 的成员函数形式
  3. 请勿在同一声明中混用getline>>
  4. 使用循环。

答案 2 :(得分:0)

我发现其他C ++ getline更容易使用更安全;

string str;
getline (cin,str);

会将整行放入并将其放入一个字符串中,然后可以通过许多精细的字符串方法进行播放,或者如果要对字符串的某些部分进行I / O操作则使用stringstream。

答案 3 :(得分:0)

这是我选择做的,以确保我在使用 getline 时不会遗漏任何单词或字母:

cout << "\nEnter some words: ";

while (getline(cin,myString)){
       getline(cin,myString);
       break;
};