大学レベルのコンピューターサイエンスを教えるほとんどのC ++インストラクターが、文字列をテキストに使用することを思いとどまらせたり、禁止したりするのではなく、学生に文字配列の使用を要求するのはなぜだと思いますか?
私はこの方法論が何らかのプログラミング習慣を教えることを意図していると想定していますが、私の経験では、文字列の使用だけで何も問題はなく、使用と学習が非常に簡単です。
大学レベルのコンピューターサイエンスを教えるほとんどのC ++インストラクターが、文字列をテキストに使用することを思いとどまらせたり、禁止したりするのではなく、学生に文字配列の使用を要求するのはなぜだと思いますか?
私はこの方法論が何らかのプログラミング習慣を教えることを意図していると想定していますが、私の経験では、文字列の使用だけで何も問題はなく、使用と学習が非常に簡単です。
回答:
CS学生の場合、教授はstd :: stringを思いとどまらせ、char配列を要求して、配列の基本を教えることができます。私の学校では、教師は、Cルーチンが好き書くために私たちを尋ねstrlen
、strcmp
私たち自身の上など。これより低いレベルを取得することはできません(アセンブリを離れる!)。
文字列の代わりに配列を使用することにより、メモリ管理、文字列操作、特に文字列の解析を学ぶことができます。配列を反復処理することにより、基本的に文字列を解析し、空白、特殊文字、トークンなどを探します。
しかし、私は文字列よりも配列を推奨していません。大学で配列に対処する理由を述べているだけです。
KoenigとMoeのAccelerated C ++とStroustrupのプログラミング:C ++の原理と実践では、最初から標準ライブラリのstd :: stringおよびその他のコンポーネントを使用しています。私の記憶が正しければ、KoenigとMoeのC配列も表示されず、Stroustrupはこの本のかなり遅い部分(おそらくは別館でも)でそれを行います。
そのアプローチは、モダンとして認定されており、私のサークルでは推奨されるアプローチです。他のアプローチは、しばしば歴史的であると見なされ、C ++の進化をより忠実に踏襲していますが、「新しい」(相対的に、現在15歳)開発を利用せず、現在行われていることを教えていません(少なくともあまりにも多くの遺産に悩まされていないプロジェクト)10年前(主流になる前に常に遅れがあります)。
「ほとんど」または「一部」のプログラミングインストラクターについては何も言えませんが、CSカリキュラムでは、初期のプログラミングコースには2つの目標があると言えます。
これらは時々やや矛盾し、教師が異なればトレードオフも異なります。
それはあなたがそのコースで何を教えようとしているのかによると思います... "コンピュータサイエンス"はやや曖昧な定義です。
コースがアルゴリズムとデータ構造に関するものである場合、生徒に教えることstd::string
は教育的な価値がまったくありません。char
ただし、配列とその操作の概要として配列を使用することは非常に正当です。
コースがオブジェクトの設計に関するものでstd::string
ある場合、抽象データ型の例としていくつかの価値があると思います。
コースがC ++のベストプラクティスについてのみである場合、私はあなたの大学の種類と彼らがコンピュータサイエンスのカリキュラムをどのように設計するかについて心配するでしょう。
優れたC ++は(基本的に)標準ライブラリによって提供される抽象化を使用するため、コースの実際の目標を誤解していると思います(ホイールを再発明したいのはなぜですか?)。
StroustrupのFAQには、「配列をインターフェイスから除外する」との引用があり、安全なコードの記述方法に関するヒントをいくつか提供しています。したがって、それらは悪いので実際には使用しないように指示されているのではないかと思いますが、物事がどのように機能するかの基本を学ぶため、後で最適化やその他の作業に実際に取り組む必要がある場合は、その理解を使用できます。本当の基本が必要です。
場合によっては、文字列は他の文字列で良いですが、charと同じではありません
/ **例1の文字列の使用この場合、文字列は出力でスペースによってカットされます。deltest.txtを書き込んだ場合、出力はLine 1 del Line 2 test.txtになりません** /
#include <iostream>
#include <stdlib.h>
using namespace std ;
string get_input ;
int main()
{
main:
cin >> get_input ;
system(get_input.c_str()) ;
goto main ;
}
/ **例2の同じプログラムですが、80のフィールドを持つ文字で入力を渡します。最初の例は、同じ行にあるdel test.txtなので、同じcmdの出力は良い** /
#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 ;
}
文字列は、文字のシーケンスを表すオブジェクトです。
標準文字列クラスは、バイトの標準コンテナーのインターフェイスと同様のインターフェイスでそのようなオブジェクトをサポートしますが、シングルバイト文字の文字列で動作するように特別に設計された機能を追加します。
文字列クラスは、文字タイプとしてchar(つまり、バイト)を使用するbasic_stringクラステンプレートのインスタンス化であり、デフォルトのchar_traitsおよびアロケータタイプを使用します(テンプレートの詳細については、basic_stringを参照してください)。
このクラスは、使用されるエンコーディングとは無関係にバイトを処理することに注意してください。マルチバイトまたは可変長文字(UTF-8など)のシーケンスを処理するために使用される場合、このクラスのすべてのメンバー(長さやサイズなど)だけでなく、そのイテレータは、バイト単位で動作します(実際にエンコードされた文字ではありません)。-C ++リファレンスhttp://www.cplusplus.com/reference/string/string/ [1]:
私は見ることを提案します: