web-dev-qa-db-ja.com

配列へのC ++ Cin入力

私はc ++の初心者であり、文字列を1文字ずつ配列に入力して、リバース関数を実装できるようにしたいと思います。ただし、Cとは異なり、Enterキーを押すと '\ n'がストリームに挿入されません。 ..データの入力を停止するにはどうすればよいですか?

私のコードは:

#include<iostream>
#include<array>
#define SIZE 100
using namespace std;

char *reverse(char *s)
{
    array<char, SIZE>b;
    int c=0;
    for(int i =(SIZE-1);i>=0;i--){
        b[i] = s[c];
        c++;
    }

    return s;
} 

int main()
{
    cout<<"Please insert a string"<<endl;
    char a[SIZE];
    int i=0;
    do{
        cin>>a[i];
        i++;
    }while(a[i-1]!= '\0');

    reverse(a);

    return 0;
}
5
Dylan Galea

1文字ずつ読み取ると、実際にはcharactersが読み取られ、改行は空白character

また、配列がCスタイルの文字列として終了することは決してありません。それは、文字の読み取りが機能する方法ではありません。つまり、ループ条件が間違っています。

まず、文字列にstd::stringを使用することをお勧めします。それでも、文字を1文字ずつ読み取ることができます。続行するには、実際に読んだ文字を確認し、改行を読んだら読み終える必要があります。

最後に、reverse関数が機能しません。まず最初にループ自体が間違っています。次に、「逆」配列ではなく、元の文字列へのポインタを返します。


読書を助けるために、それは次のようなことができます

std::string str;
while (true)
{
    char ch;
    std::cin >> ch;
    if (ch == '\n')
    {
        break;  // End loop
    }

    str += ch;  // Append character to string
}

Stack Dannyによる回答 に示されているように、実際にはそれほど必要ではないことに注意してください。上記の私のコードでさえ、一度に1文字ずつ読み取りながら簡略化できます。

質問にC++Cではなく)のタグを付けたので、最新のC++ヘッダーで実際に解決しないでください。独自の機能))?

#include <string>
#include <algorithm>
#include <iostream>

int main(){
    std::string str;
    std::cout << "Enter a string: ";
    std::getline(std::cin, str);

    std::reverse(str.begin(), str.end());

    std::cout << str << std::endl;

    return 0;
}

出力:

Enter a string: Hello Test 4321
1234 tseT olleH
6
Stack Danny