C ++ Strings vs. Character Arrays

8

Warum denken Sie, ist es so, dass die meisten C ++ - Lehrer, die Informatik auf College-Ebene unterrichten, davon abhalten oder sogar verbieten, Zeichenfolgen für Text zu verwenden, anstatt von den Schülern die Verwendung von Zeichenarrays zu verlangen?

Ich gehe davon aus, dass diese Methode irgendwie dazu gedacht ist, gute Programmiergewohnheiten zu vermitteln, aber meiner Erfahrung nach sehe ich nichts falsches daran, nur Strings zu verwenden, und sie sind wesentlich einfacher zu verwenden und zu lernen.

Taylor Huston
quelle
9
Haben Sie eine Referenz für die Behauptung, dass "die meisten C ++ - Lehrer, die Informatik auf College-Ebene unterrichten, die Verwendung von Zeichenfolgen für Text abschrecken oder sogar verbieten, anstatt von den Schülern die Verwendung von Zeichenarrays zu verlangen?" Ich bin mir nicht sicher, ob das im Allgemeinen stimmt. Wenn ja, vermute ich, dass Professoren aus demselben Grund die Verwendung von Bibliotheken verbieten oder davon abhalten: weil die Schüler mehr über die Grundlagen lernen, indem sie die Dinge selbst von Grund auf neu machen?
Patrick87
Ich kenne die Professoren der Portland State University und aus dem, was ich in einigen Foren über die Verwendung von Zeichenarrays gegen Zeichenfolgen gelesen habe, die allgemein zutreffend zu sein schienen. Ich könnte völlig falsch liegen, genau das habe ich in meiner (begrenzten) Erfahrung gesammelt.
Taylor Huston
3
@ TaylorHuston, sollten Sie wahrscheinlich diese Professoren fragen.
Svick
4
Herzlich willkommen! Dies ist eine Frage der Programmierdidaktik (nicht ganz CS), und sie fragt nach einer Meinung. Gewählt, um so zu schließen. An meiner Universität unterrichten sie übrigens überhaupt nicht C ++. Professoren haben eine Tendenz haben beste Praxis in ihrem Code zu vermeiden, though. Ich denke, das liegt daran, dass sie Informatiker sind, keine Programmierer.
Raphael
3
@Raphael Da diese Kurse oft von Informatikern unterrichtet werden und oft gleichzeitig eine Einführung in Programmierung und Informatik darstellen, denke ich, dass die Frage hier thematisch ist und dies ein geeigneter Ort dafür ist, da das Publikum (die potenzielle Antwortende) wären Informatiker. Ich bezweifle die Behauptung, aber Fragen mit falschen Annahmen sind in Ordnung und sollten mit einer Widerlegung beantwortet werden.
Gilles 'SO - hör auf böse zu sein'

Antworten:

7

Für einen CS-Studenten kann der Professor std :: string entmutigen und nach char array fragen, um die Grundlagen des Arrays zu vermitteln. In meiner Schule, fragte der Lehrer uns C - Routinen wie zu schreiben strlen, strcmpusw. auf unserem eigenen. Es kann dann kein niedriges Niveau erreichen (Verlassen der Baugruppe!).

Durch die Verwendung eines Arrays anstelle eines Strings können Sie die Speicherverwaltung und String-Operationen, insbesondere das Parsen von Strings, erlernen. Wenn Sie über ein Array iterieren, analysieren Sie im Grunde die Zeichenfolge und suchen nach Leerzeichen, Sonderzeichen, Token usw.

Aber ich empfehle Array überhaupt nicht über String. Ich gebe nur einen Grund an, mit Arrays an der Universität fertig zu werden.

user1182
quelle
7

Koenig und Moes Accelerated C ++ und Stroustrups Programmierung: Prinzipien und Praxis Die Verwendung von C ++ verwendet von Anfang an std :: string und andere Komponenten aus der Standardbibliothek. Wenn ich mich richtig erinnere, präsentieren sie nicht einmal C-Arrays für Koenig und Moe und Stroustrup macht es ziemlich spät im Buch (vielleicht sogar nur in einem Anhang).

Dieser als modern bezeichnete Ansatz ist in meinen Kreisen der bevorzugte. Der andere Ansatz, der oft als historisch bezeichnet wird , folgt genauer der Entwicklung von C ++, nutzt jedoch nicht die "neuere" Entwicklung (relativ, sie sind jetzt 15 Jahre alt) und lehrt nicht, was jetzt praktiziert wird (zumindest nicht weiter) Projekte, die nicht mit zu viel Vermächtnis belastet sind), aber vor 10 Jahren (es gibt immer eine Verzögerung, bevor sie zum Mainstream werden).

Ein Programmierer
quelle
4

Ich kann nichts über "die meisten" gegenüber "einigen" Programmierlehrern sagen, aber ich kann sagen, dass in einem CS-Lehrplan die frühen Programmierkurse zwei Ziele haben:

  • Bereiten Sie die Schüler auf Themen vom Typ Software Engineering vor
  • Gewöhnen Sie die Schüler daran, wie die grundlegenden Operationen eines Computers aussehen und wie sich unterschiedliche Implementierungen übergeordneter Konzepte wie Zeichenfolgen verhalten

Diese sind manchmal etwas uneins, und verschiedene Lehrer machen unterschiedliche Kompromisse.

Louis
quelle
2
Sie vergessen mindestens ein drittes Ziel: Voraussetzungen für andere Kurse und Pflichtpraktika vermitteln.
AProgrammer
1
Wenn es sich bei dem Kurs um Algorithmen handelt, ist der Low-Level-Ansatz besser. Wenn es sich bei dem Kurs um das Abrufen von Informationen handelt, ist der Ansatz auf hoher Ebene besser. Unterschiedliche Kurse wollen unterschiedliche Dinge.
Louis
4

Ich denke, es hängt davon ab, was Sie in diesem Kurs unterrichten wollen ... "Informatik" ist eine etwas vage Definition.

Wenn sich der Kurs mit Algorithmen und Datenstrukturen befasst, hat das Unterrichten von Studenten std::stringabsolut keinen didaktischen Wert. Die Verwendung von charArrays als Einführung in Arrays und Operationen darauf ist jedoch durchaus legitim.

Wenn es sich bei dem Kurs um Objektdesign handelt, hat er vermutlich std::stringeinen Wert als Beispiel für einen abstrakten Datentyp.

Wenn es sich bei dem Kurs nur um Best Practices in C ++ handelt, würde ich mir Gedanken darüber machen, an welcher Hochschule Sie studieren und wie sie ihren Lehrplan für Informatik gestalten.

Pedro
quelle
2

Ich denke, Sie haben das eigentliche Ziel Ihres Kurses falsch verstanden, da gutes C ++ (im Grunde genommen) die Abstraktionen verwendet, die von der Standardbibliothek bereitgestellt werden (warum sollten Sie das Rad neu erfinden?).

In seinen FAQ gibt es sogar ein Zitat von Stroustrup mit dem Titel "Arrays von Schnittstellen fernhalten", in dem er einige Hinweise zum Schreiben von sicherem Code gibt. Daher bezweifle ich, dass Ihnen tatsächlich gesagt wird, dass Sie sie nicht verwenden sollen, weil sie schlecht sind, sondern dass Sie einige Grundlagen der Funktionsweise der Dinge lernen müssen, damit Sie dieses Verständnis später nutzen können, wenn Sie tatsächlich in die Optimierung oder andere Arbeiten einsteigen müssen, für die Sie arbeiten brauche die wirklichen Grundlagen.

Sim
quelle
0

In einigen Fällen sind Zeichenfolgen gut, in anderen Fällen sind sie für char nicht gleich

/ ** Beispiel 1 String-Verwendung In diesem Fall wird der String durch Leerzeichen an der Ausgabe abgeschnitten, wenn wir del test.txt geschrieben haben. Die Ausgabe ist Zeile 1 del Zeile 2 test.txt, was nicht gut ist ** /

#include <iostream>
#include <stdlib.h>
using namespace std ; 

string get_input ;

int main()
{
main:
    cin >> get_input ;
    system(get_input.c_str()) ;
    goto main ;
}

/ ** Beispiel 2 dasselbe Programm, aber wir übergeben die Eingabe in einem Zeichen mit einem Feld von 80. Die Ausgabe für dieselbe cmd wie das erste Beispiel ist del test.txt in derselben Zeile, die gut ist ** /

#include <iostream>
#include <stdlib.h>
using namespace std ; 

char input[80] ;
string get_input ;

int main()
{
main:
    cin.getline(input ,80) ;
    get_input = input ;
    system(get_input.c_str()) ;
    goto main ;
}

Zeichenfolgen sind Objekte, die Zeichenfolgen darstellen.

Die Standardzeichenfolgenklasse bietet Unterstützung für solche Objekte mit einer Schnittstelle, die der eines Standardcontainers von Bytes ähnelt, jedoch Funktionen hinzufügt, die speziell für die Arbeit mit Zeichenfolgen mit Einzelbytezeichen entwickelt wurden.

Die Zeichenfolgenklasse ist eine Instanziierung der Klassenvorlage basic_string, die char (dh Bytes) als Zeichentyp mit den Standardtypen char_traits und Allocator verwendet (weitere Informationen zur Vorlage finden Sie unter basic_string).

Beachten Sie, dass diese Klasse Bytes unabhängig von der verwendeten Codierung verarbeitet: Wenn sie zur Verarbeitung von Sequenzen von Zeichen mit mehreren Bytes oder variabler Länge (z. B. UTF-8) verwendet wird, werden alle Mitglieder dieser Klasse (z. B. Länge oder Größe) sowie Die Iteratoren arbeiten weiterhin in Bytes (keine tatsächlich codierten Zeichen). -C ++ Referenz http://www.cplusplus.com/reference/string/string/ [1]:

Ich schlage vor zu schauen:

TKIPAES
quelle