[英]Why is cin.getline() skipping the first word in each line?
我正在尝试逐行显示命令行输入的文本文件的文本。 但出于某种原因,它会跳过第一行之后每行的第一个单词。
代码:
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
代码省略了“Call”和“little”。
我觉得这是一个 \\n 错误,但我不知道如何修复它。 在此先感谢您的帮助。
cin.getline(x,100) >> argv[2];
您将一行(或该行的前 99 个字符)读入x
。 然后跳过任何空格并将下一个单词读入argv[2]
。 第一个词在那里结束。
你为什么使用>> argv[2]
? 你可能想用这个做什么? argv[2]
可能不存在,即使存在,您也无法控制argv[2]
指向的字符数组的大小,因此超出该数组的可能性非常高。
与其直接为此使用char
数组,不如使用std::getline
和std::string
将行读入std::string
对象:以这种方式编写正确的代码要容易得多。 例如,
std::string x;
if (!std::getline(std::cin, x)) {
// handle input error
}
@James McNellis 已经指出了基本问题。 我的建议是:
getline
的成员函数形式。getline
和>>
。我发现另一个 C++ getline 使用起来更容易、更安全;
string str;
getline (cin,str);
将整行并将其放入一个字符串中,然后您可以通过许多精细的字符串方法进行播放,或者如果您想对字符串的某些部分进行 I/O,则可以使用 stringstream。
这是我选择做的,以确保我在使用getline
时不会遗漏任何单词或字母:
cout << "\nEnter some words: ";
while (getline(cin,myString)){
getline(cin,myString);
break;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.