#include <iostream>
using namespace std;
int main()
{
int n,t=0,k=0;
cin>>n;
char data[n][100];
int num[n];
for(int i=0;i<n;i++)
{
while(1)
{
cin>>data[i][t];
cout<<data[i][t]<<endl;
if(data[i][t]=='\n') break;
k++;
if(k%2==1) t++;
}
cout<<i;
num[i]=(t-2)/2;
k=0;
t=0;
}
for(int i=0;i<n;i++)
{
while(1)
{
cout<<data[i][t];
if(t==num[i]) break;
t++;
}
t=0;
}
}
这里是我用c ++编写的代码,它给出了用户给出的每个单词的起始半部分的偶数字符,但是在按下输入后输入循环应该会中断,但循环不会中断
while(1)
{
cin>>data[i][t];
cout<<data[i][t]<<endl;
if(data[i][t]=='\n') break;
k++;
if(k%2==1) t++;
}
答案 0 :(得分:9)
默认情况下,使用“input”运算符>>
格式化输入跳过空格,换行符是空白字符。所以发生的事情是>>
运算符只是等待输入一些非空白输入。
要告诉输入不要跳过空格,你必须使用std::noskipws
操纵器:
cin>>noskipws>>data[i][t];
答案 1 :(得分:0)
有一些方法可以在C ++中实现OP尝试做的事情。我开始避免使用可变长度数组,这些数组不在标准中,而是使用std::string
和std::vector
代替。
一个选项是使用std::getline
从输入读取整行,然后处理结果字符串以仅保留偶数字符的前半部分:
#include <iostream>
#include <string>
#include <vector>
int main() {
using std::cin;
using std::cout;
using std::string;
cout << "How many lines?\n";
int n;
cin >> n;
std::vector<string> half_words;
string line;
while ( n > 0 && std::getline(cin, line) ) {
if ( line.empty() ) // skip empty lines and trailing newlines
continue;
string word;
auto length = line.length() / 2;
for ( string::size_type i = 1; i < length; i += 2 ) {
word += line[i];
}
half_words.push_back(word);
--n;
}
cout << "\nShrinked words:\n\n";
for ( const auto &s : half_words ) {
cout << s << '\n';
}
return 0;
}
另一个是,正如Joachim Pileborg在他的回答中所做的那样,禁止通过带有std::noskipws
操纵符的格式化输入函数跳过前导空格,然后一次读取一个字符:
// ...
// disables skipping of whitespace and then consume the trailing newline
char odd, even;
cin >> std::noskipws >> odd;
std::vector<string> half_words;
while ( n > 0 ) {
string word;
// read every character in a row till a newline, but store in a string
// only the even ones
while ( cin >> odd && odd != '\n'
&& cin >> even && even != '\n' ) {
word += even;
}
// add the shrinked line to the vector of strings
auto half = word.length() / 2;
half_words.emplace_back(word.begin(), word.begin() + half);
--n;
}
// ...