1

まず、これは「宿題」の質問であるため、ベクターライブラリと文字列ライブラリは立ち入り禁止です。私はC++の基本に到達しようとしています。

このコードでの私の意図は、文字列配列の配列を作成して使用することです。言い換えれば、単語のリスト。

このコードを実行すると、ナンセンスがたくさん出てきます。

C ++で単語のリストを作成するためのより良い方法があれば、私はそれについて聞いてみたいです。

const int cart_length = 50;
const int word_length = 50;

int main()
{

char cart_of_names[cart_length][word_length]; 
float cart_of_costs[cart_length];

char name[word_length];
cout << "enter the name of the first item: ";
cin >> name;
for(int i=0; i<word_length; i++)
{
    cart_of_names[0][i] = name[i];
}
cout << endl;
cout << "that is: ";
for(int x=0; x<word_length; x++)
{   

        cout << cart_of_names[0][x];
}
cout << endl;

return 0;
}
4

9 に答える 9

4

入力された文字列の長さが50文字(cart_length)でない場合、名前に有効なのは50文字未満です。if(cart_of_names[0][x]==0) break;2番目のループにが必要です。

于 2009-10-05T16:34:15.180 に答える
2

私はあなたが探しているものを正確に理解していません。次のコードは、50語のリストを読んで印刷するのに役立ちます。これがお役に立てば幸いです。

const int cart_length = 50;
const int word_length = 50;

int main()
{

    char cart_of_names[cart_length][word_length]; 
    float cart_of_costs[cart_length];

    for(int i=0; i<cart_length; i++)
    {
        cout << "enter the name of the " << i + 1 << "th item: ";

        cin >> cart_of_names[i];
    }

    cout << "that is: ";

    for(int x=0; x < cart_length; x++)
    {       
        cout << cart_of_names[x] << endl;
    }

    return 0;
}
于 2009-10-05T16:49:06.507 に答える
2

STLSoftのfixed_array_2d(およびそれはより高次の兄弟)をチェックしてください。MatthewWilsonのImperfectC++で最大のパフォーマンスを実現するためにそれらをどのように実装するかについての詳細な説明があります。

于 2009-10-05T21:26:03.687 に答える
0

Cでは、あなたがやろうとしていることを概念化するために私が見つけた最良の方法は、char*の配列を使用することです。同じ効果ですが、それを使い始めると、脳の方が簡単だと思うかもしれません。

于 2009-10-05T16:49:26.070 に答える
0

それは私にかなり近いように見えます。Cの文字列はヌル文字で終了します。これは、文字列の終わりがヌル文字で示されることを意味します。ある意味で、Cの文字列は実際には単なるバイトの配列です。

あなたがするとき:

cout << "enter the name of the first item: ";
cin >> name;

文字列「Book」を入力すると、メモリでは次のようになります。

|0|1|2|3|4|5..49|
|B|o|o|k|0|*HERE BE DRAGONS*

実際には、これらの文字に対応するASCII値が含まれますが、私たちの目的では、これらの文字が含まれています。初期化していないメモリがhere be dragonsあるため、プラットフォームで設定されているガベージが含まれています。

0したがって、文字列をコピーするときは、代わりに文字列の最後にあるそのバイトを探す必要があります。

for(int i=0; name[i]!=0; i++)
{
    cart_of_names[0][i] = name[i];
}

次に、出力するときに、実際に一度に1文字ずつ出力する必要はありません。あなたはただすることができますcout<<cart_of_names[0]coutその終了ヌル文字のために文字列がどこで終了するかを知っています。

于 2009-10-05T16:50:12.123 に答える
0

std :: stringを使用できない場合は、少なくともCのstrncpy()のような関数を見て名前をコピーしてください。また、cスタイルの文字列がnullで終了することを忘れています。

于 2009-10-05T16:31:01.303 に答える
0

cart_of_names [0] [i] = name [i];の代わりにstrcpy()を使用する場合

それはうまくいくかもしれませんが、私はそのすべてのコードを見るだけでうんざりします。

于 2009-10-05T16:32:50.610 に答える
0

STLの使用が禁止されていない限り(これは単なる意味です)、を使用してstd::list<std::string>ください。www.cplusplus.comには、これらのクラスの詳細な説明と例があります。

そうしないと、char配列の配列でスタックします。その場合、多くのバッファオーバーフローエラーに備えてください。上記のサイトでchar[]管理機能(strncpy()など)を探してください。これらの機能を使用すると、作業が少し楽になります(ただし、それほど多くはありません)。

于 2009-10-05T16:34:19.267 に答える
0

「C++で単語のリストを作成するためのより良い方法があれば、それについて聞いてみたいです。」

を含め#include <string>て使用しますstd::string。このstd::string型はC++仕様の一部だと思います。

#include <iostream>
#include <string>

int main(void) {
  std::string list[7];

  list[0] = "In C++";
  list[1] = "you can use";
  list[2] = "the `std::string` type.";
  list[3] = "It removes";
  list[4] = "many of the problems";
  list[5] = "introduced by";
  list[6] = "C-style strings.";

  for (int k=0; k<7; k++) std::cout << list[k] << ' ';
  std::cout << '\n';
  return 0;
}
于 2009-10-05T20:23:19.007 に答える