2
#include<iostream>
#include<cstdio>
using namespace std;

int main()
{
    int T;
    char J[100], S[100];
    int count=0;
    cin >> T;

    while(T--)
    {
        cin.getline(J,100);

        cin.getline(S,100);
        puts(J);
        puts(S);

        for(int i=0; J[i]!='\0'; i++)
        {
            for(int j=0; S[j]!='\0'; j++)
            {
                count++;
                for(int k=j; S[k]!='\0'; k++)
                    S[k]=S[k+1];
                break;
            }
         }
         cout << count;
    }
    return 0;
}

J、Sで入力文字列を取得していますが、プログラムの実行中にコンソールcin.getlineからの2番目の入力をスキップしますテストケースを取得し、文字列JとSを取得しますJは正常に取得されますが、S文字列を取得できません

4

3 に答える 3

1

このコード:

int T;
// ...
cin>>T;

int...標準入力から読み取ります。それを読み取らせるintには、キーを押す必要がありますenterが、このコードはそれを入力バッファーから削除しません。enterそれで...

cin.getline(J,100);

これは、最初の改行文字まで、入力バッファーから文字列を読み取ろうとします。その改行を入力バッファーから削除しますが、文字列の一部としては含めません。そのため、よく見ないと、基本的に何もしていないように見えます。つまり、空の文字列になってしまいます。

cin >> T;一般に、フィールド指向の入力 (または行指向の入力 ( )など) に固執する必要がありますgetline。ただし、2 つを混在させると、特にフィールド指向の入力のgetlineにが来る場合は、少し注意が必要です。取得しないでください。私は間違っています: それ機能する可能性があり、完全に機能しますが、自分が何をしているのかを知る必要があり、それでも時々驚かされることがあります。

私のコメント (および @johnathon の回答) に記載されているように、通常、char の配列ではなく、std::getlineを読み取るために使用することもできます。後者は、せいぜい扱いにくいです。std::stringstd::cin.getline

私自身の好みは、(原則として)どこでも使用する場合は、全体で行指向の入力を使用することです。

std::string temp;

std::getline(std::cin, temp);

int T = lexical_cast<int>(temp);

while (T--) {
   std::string j;

   std::getline(std::cin, j);

   // ...

余談Tですが、C++ で通常の変数の名前として使用することも避けたいと思います。テンプレート パラメーターの名前としてよく使用されます。「通常の」変数に使用すると、特にテンプレートを頻繁に使用する高度なプログラマーにとって、混乱を招く可能性が高くなります。

于 2012-05-09T04:12:58.817 に答える
1

string 、 std::string を使用し、次のように getline を呼び出す必要があります

std::string s,j;
std::getline(std::cin,j);
std::getline(std::cin,s);

そして、個々の文字ごとに文字列の内容を反復したい場合

for(auto i = std::begin(s); i != std::end(s); ++i)
{
     std::cout << *i << std::endl;
}

イテレータを使用し、それらを参照して実際の文字値を取得します。できるだけ C 文字列から離れてください。

于 2012-05-09T03:51:20.440 に答える
0

(1) cin>>T と while (T--) の間で getchar() を次のように使用します。

int T;
char J[100] , S[100];
int count=0;
cin>>T;
getchar();
while(T--){
cin.getline(J,100);
cin.getline(S,100);

(2)。次の方法で問題を解決することもできます::

char  T[10];
char J[100] , S[100];
int count=0;
getline(T,10);

while((atoi(T))--){

cin.getline(J,100);

cin.getline(S,100);

それらのいずれかを使用すると、問題が解決します。

于 2012-05-09T06:54:15.477 に答える