C ++文字列と文字配列


8

大学レベルのコンピューターサイエンスを教えるほとんどのC ++インストラクターが、文字列をテキストに使用することを思いとどまらせたり、禁止したりするのではなく、学生に文字配列の使用を要求するのはなぜだと思いますか?

私はこの方法論が何らかのプログラミング習慣を教えることを意図していると想定していますが、私の経験では、文字列の使用だけで何も問題はなく、使用と学習が非常に簡単です。


9
「大学レベルのコンピュータサイエンスを教えるほとんどのC ++インストラクターは、テキストに文字列を使用することを思いとどまらせたり、禁止したりし、代わりに文字配列を使用するよう生徒に要求する」という主張についての言及はありますか?一般的に、それが本当かどうかはわかりません。もしそうなら、それは、教授がライブラリの使用を禁止または阻止したのと同じ理由によると思います。
Patrick87 2012

私はポートランド州立大学の教授が知っていることを知っています。また、いくつかのフォーラムで読んだことから、文字配列と文字列の使用について一般的に正しいように思われました。私は完全に間違っている可能性があります。それは私の(限られた)経験で獲得したものです。
テイラーヒューストン

3
@TaylorHuston、あなたはおそらくそれらの教授に尋ねるべきです。
スビック

4
ようこそ!これはプログラミング(CSではない)の教授法の質問であり、意見を求めています。このように閉鎖することに投票しました。ちなみに、私の大学ではC ++をまったく教えていません。ただし、教授コードのベストプラクティスを回避する傾向があります。彼らはプログラマーではなくコンピューター科学者だからだと思います。
ラファエル

3
@Raphaelこれらのコースは、多くの場合コンピューターサイエンティストによって教えられ、プログラミングとコンピューターサイエンスを同時に紹介することが多いため、ここではトピックについてのトピックであると思います。潜在的な回答者)はコンピューター科学者でしょう。私はその主張を疑うが、間違った仮定の質問は大丈夫であり、反駁をもって答えられるべきである。
Gilles「SO-邪悪なことをやめよ」

回答:


7

CS学生の場合、教授はstd :: stringを思いとどまらせ、char配列を要求して、配列の基本を教えることができます。私の学校では、教師は、Cルーチンが好き書くために私たちを尋ねstrlenstrcmp私たち自身の上など。これより低いレベルを取得することはできません(アセンブリを離れる!)。

文字列の代わりに配列を使用することにより、メモリ管理、文字列操作、特に文字列の解析を学ぶことができます。配列を反復処理することにより、基本的に文字列を解析し、空白、特殊文字、トークンなどを探します。

しかし、私は文字列よりも配列を推奨していません。大学で配列に対処する理由を述べているだけです。


7

KoenigとMoeのAccelerated C ++とStroustrupのプログラミング:C ++の原理と実践では、最初から標準ライブラリのstd :: stringおよびその他のコンポーネントを使用しています。私の記憶が正しければ、KoenigとMoeのC配列も表示されず、Stroustrupはこの本のかなり遅い部分(おそらくは別館でも)でそれを行います。

そのアプローチは、モダンとして認定されており、私のサークルでは推奨されるアプローチです。他のアプローチは、しばしば歴史的であると見なされ、C ++の進化をより忠実に踏襲していますが、「新しい」(相対的に、現在15歳)開発を利用せず、現在行われていることを教えていません(少なくともあまりにも多くの遺産に悩まされていないプロジェクト)10年前(主流になる前に常に遅れがあります)。


4

「ほとんど」または「一部」のプログラミングインストラクターについては何も言えませんが、CSカリキュラムでは、初期のプログラミングコースには2つの目標があると言えます。

  • ソフトウェアエンジニアリングタイプのトピックに向けて生徒を準備する
  • コンピュータが行う基本的な操作と、文字列などの上位レベルの概念のさまざまな実装がどのように動作するかを学生に理解させる

これらは時々やや矛盾し、教師が異なればトレードオフも異なります。


2
少なくとも3つ目の目標を忘れます。他のコースの必須条件と必須のインターンシップを教えることです。
AProgrammer 2012

1
コースがアルゴリズムの場合、低レベルのアプローチの方が適しています。コースが情報検索の場合は、高レベルのアプローチの方が適しています。コースによって、求められるものは異なります。
Louis

4

それはあなたがそのコースで何を教えようとしているのかによると思います... "コンピュータサイエンス"はやや曖昧な定義です。

コースがアルゴリズムとデータ構造に関するものである場合、生徒に教えることstd::stringは教育的な価値がまったくありません。charただし、配列とその操作の概要として配列を使用することは非常に正当です。

コースがオブジェクトの設計に関するものでstd::stringある場合、抽象データ型の例としていくつかの価値があると思います。

コースがC ++のベストプラクティスについてのみである場合、私はあなたの大学の種類と彼らがコンピュータサイエンスのカリキュラムをどのように設計するかについて心配するでしょう。


2

優れたC ++は(基本的に)標準ライブラリによって提供される抽象化を使用するため、コースの実際の目標を誤解していると思います(ホイールを再発明したいのはなぜですか?)。

StroustrupのFAQには、「配列をインターフェイスから除外する」との引用があり、安全なコードの記述方法に関するヒントをいくつか提供しています。したがって、それらは悪いので実際には使用しないように指示されているのではないかと思いますが、物事がどのように機能するかの基本を学ぶため、後で最適化やその他の作業に実際に取り組む必要がある場合は、その理解を使用できます。本当の基本が必要です。


0

場合によっては、文字列は他の文字列で良いですが、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]:

私は見ることを提案します:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.