wake-up-neo.com

Array in C++ drucken?

Gibt es eine Möglichkeit, Arrays in C++ zu drucken?

Ich versuche, eine Funktion zu erstellen, die ein Benutzereingabearray umkehrt und es dann druckt. Ich habe versucht, dieses Problem zu googeln und es schien, als ob C++ keine Arrays drucken kann. Das kann nicht wahr sein, oder?

40
JohnHemmars

kannst du nicht einfach die Elemente durchlaufen? so was:

for (int i = numElements - 1; i >= 0; i--) 
    cout << array[i];

Hinweis: Wie Maxim Egorushkin darauf hingewiesen hat, könnte dies überlaufen. Siehe seinen Kommentar für eine bessere Lösung.

42
Botz3000

Verwenden Sie die STL

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
    std::vector<int>    userInput;

    // Read until end of input.
    // Hit control D  
    std::copy(std::istream_iterator<int>(std::cin),
              std::istream_iterator<int>(),
              std::back_inserter(userInput)
             );

    // Print in Normal order
    std::copy(userInput.begin(),
              userInput.end(),
              std::ostream_iterator<int>(std::cout,",")
             );
    std::cout << "\n";

    // Print in reverse order:
    std::copy(userInput.rbegin(),
              userInput.rend(),
              std::ostream_iterator<int>(std::cout,",")
             );
    std::cout << "\n";

    // Update for C++11
    // Range based for is now a good alternative.
    for(auto const& value: userInput)
    {
        std::cout << value << ",";
    }
    std::cout << "\n";
}
45
Martin York

Darf ich den Fischknochenoperator vorschlagen?

for (auto x = std::end(a); x != std::begin(a); )
{
    std::cout <<*--x<< ' ';
}

(Kannst du es erkennen?)

25
fredoverflow

Neben den for-loop-basierten Lösungen können Sie auch einen ostream_iterator <> verwenden. Hier ein Beispiel, das den Beispielcode in der (jetzt im Ruhestand befindlichen) SGI STL-Referenz nutzt:

#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
  short foo[] = { 1, 3, 5, 7 };

  using namespace std;
  copy(foo,
       foo + sizeof(foo) / sizeof(foo[0]),
       ostream_iterator<short>(cout, "\n"));
}

Dies generiert Folgendes:

 ./a.out 
1
3
5
7

Dies kann jedoch zu viel für Ihre Bedürfnisse sein. Ein Straight for-Loop ist wahrscheinlich alles, was Sie brauchen, obwohl Litbs Vorlage Zucker auch ganz nett ist.

Bearbeiten: Die Anforderung "Drucken in umgekehrter Richtung" wurde vergessen. Hier ist eine Möglichkeit, dies zu tun:

#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
  short foo[] = { 1, 3, 5, 7 };

  using namespace std;

  reverse_iterator<short *> begin(foo + sizeof(foo) / sizeof(foo[0]));
  reverse_iterator<short *> end(foo);

  copy(begin,
       end,
       ostream_iterator<short>(cout, "\n"));
}

und die Ausgabe:

$ ./a.out 
7
5
3
1

Edit: C++ 14-Update, das die obigen Codeausschnitte mithilfe von Array-Iteratorfunktionen wie std :: begin () und std :: rbegin () vereinfacht:

#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    short foo[] = { 1, 3, 5, 7 };

    // Generate array iterators using C++14 std::{r}begin()
    // and std::{r}end().

    // Forward
    std::copy(std::begin(foo),
              std::end(foo),
              std::ostream_iterator<short>(std::cout, "\n"));

    // Reverse
    std::copy(std::rbegin(foo),
              std::rend(foo),
              std::ostream_iterator<short>(std::cout, "\n"));
}
12
Void

Es gibt deklarierte Arrays und Arrays, die nicht deklariert sind, aber anderweitig erstellt wurden, insbesondere mit new:

int *p = new int[3];

Dieses Array mit 3 Elementen wird dynamisch erstellt (und auch 3 könnte zur Laufzeit berechnet worden sein), und p wird ein Zeiger darauf zugewiesen, dessen Größe aus seinem Typ gelöscht wurde. Sie können nicht mehr die Größe zum Drucken des Arrays erhalten. Eine Funktion, die nur den Zeiger darauf empfängt, kann dieses Array daher nicht drucken. 

Das Drucken deklarierter Arrays ist einfach. Sie können sizeof verwenden, um ihre Größe zu ermitteln, und diese Größe an die Funktion übergeben, einschließlich eines Zeigers auf die Elemente des Arrays. Sie können jedoch auch eine Vorlage erstellen, die das Array akzeptiert und dessen Größe von seinem deklarierten Typ ableitet:

template<typename Type, int Size>
void print(Type const(& array)[Size]) {
  for(int i=0; i<Size; i++)
    std::cout << array[i] << std::endl;
}

Das Problem dabei ist, dass es keine Zeiger (offensichtlich) akzeptiert. Ich denke, die einfachste Lösung ist die Verwendung von std::vector. Es ist ein dynamisches, anpassbares "Array" (mit der Semantik, die Sie von einer echten erwarten würden), das eine size-Memberfunktion hat:

void print(std::vector<int> const &v) {
  std::vector<int>::size_type i;
  for(i = 0; i<v.size(); i++)
    std::cout << v[i] << std::endl;
}

Sie können diese Vorlage natürlich auch als Vorlage für Vektoren anderer Typen verwenden. 

Die meisten der in C++ verwendeten Bibliotheken können Arrays an sich nicht drucken. Sie müssen es manuell durchlaufen und jeden Wert ausdrucken.

Das Drucken von Arrays und das Ablegen vieler verschiedener Arten von Objekten ist ein Merkmal von übergeordneten Sprachen.

3

Es ist sicherlich! Sie müssen das Array durchlaufen und jedes Element einzeln ausdrucken.

3
Andy Mikula

C++ kann drucken, was Sie möchten, wenn Sie es programmieren. Sie müssen das Array selbst durchgehen und jedes Element drucken.

3
Cogwheel

Das könnte helfen//Drucken des Arrays

for (int i = 0; i < n; i++)
{cout << numbers[i];}

n ist die Größe des Arrays

0

Meine einfache Antwort lautet:

#include <iostream>
using namespace std;

int main()
{
    int data[]{ 1, 2, 7 };
    for (int i = sizeof(data) / sizeof(data[0])-1; i >= 0; i--) {
        cout << data[i];
    }

    return 0;
}
0
ej8000