2017-02-11 15 views
-5

私はランダムな単語でいっぱいの文字列配列std::string words[4000]を持っています。私はこの配列内のランダムな単語のサイズを確認したい。私が試した:RNDはランド(から返された番号であるC++文字列配列内の要素のサイズをチェックする方法は?

int x = words[rnd].length(); 

int x = words[rnd].size();

int x = sizeof(words[rnd]);

)を。しかし、両方の時間xは0の値をとり、sizeof()は常に28を返します。ここで何が間違っていますか?完全なコードをチェックしたい人のため

#include <iostream> 
#include <fstream> 
#include <string> 
#include <time.h> 
#include <stdlib.h> 
std::string words[4000];  ` 
void fread(std::string fname, std::string words[], const int & nwords) 

    { 

     std::ifstream ifile(fname.c_str(), std::ios::in); 

     if (!ifile) 
     { 
      std::cout << " Couldn’t read the file " << fname; 
      exit(-1); 
      //return; 
     } 

     int count = 0; 
     while (ifile && count < nwords) 
      ifile >> words[count++]; 
     ifile.close(); 
    } 

    `int main()` 
    `{` 

     srand(time(NULL)); 
     int nwords = 4000; 
     int rnd = rand() % nwords; 
     int x = words[rnd].length()/3; 
     fread("<location>", words, nwords); 
     int* hintloc = new int[x]; 
     std::cout << words[rnd]; //this checks whether i have the right word 
     const int hangsize = 19; 
     bool chk; 
     std::cout << "\n\n\t\t\tGET READY FOR HANGMAN!\n\n\t\tGuess this word: "; 
     for (int i = 0; i < x; i++) 
     { 
      hintloc[i] = rand() % words[rnd].size(); 
      for (int j = 0; j < i; j++) 
      { 
       if (hintloc[i] == hintloc[j]) 
        i--; 
      } 
     } 

     for (int i = 0; i < words[rnd].size(); i++) 
     { 
      chk = true; 
      for (int j = 0; j < x; j++) 
      { 
       if (i == hintloc[j]) 
       { 
        std::cout << words[rnd].at(i)<<" "; 
        chk = false; 
       } 
      } 
      if (chk == true) 
       std::cout << "_ "; 
     } 

     delete[] hintloc; 
     system("pause"); 
     return 0; 
    } 
+0

'rnd'が0..3999の範囲内にあることを確認しましたか? – gurka

+0

また、 'sizeof(std :: string)'は文字列の長さを与えません。 'string'クラス/ structのサイズをバイト単位で返します。 – gurka

+0

どのように 'words'を初期化していますか? –

答えて

0

は、あなたが実際の要素は、非ゼロの長さを持っているので、これらの要素を使用する前words配列を初期化する必要があります。そうしないと、要素はデフォルトで初期化されます。デフォルトで初期化されたstd::stringは、length()size()の両方のメンバーが0の結果を与える(同じことをするので)。

ファイルから文字列を読み取り、後でチェックすると長さがゼロであることが判明した場合、ファイルに長さゼロの文字列が含まれているか、ファイルを読み取っているときにエラーが発生しています。

sizeof(words[rnd])は、std::stringタイプのサイズであるsizeof std::stringを与える。これは、任意の実際のインスタンスstd::string(例えば、words[rnd])によって保持される文字列データのサイズとは無関係です。

+0

私は、文字列がファイルから読み込まれ、配列 'words'に保存されていることを何度も確認しました。しかし、返されるサイズはまだ0です。ファイルは空ではありません。ファイルから読み込む前に別の値に初期化すると、txtファイルを読み取った後にsize()関数を呼び出しても、私が初期化した長さが返されます。 –

+0

そうかもしれません。しかし、問題はここに表示するかどうかにかかわらず、あなたのコードとそれが動作するデータにあります。しかし、MCVEを提供していない限り(つまり、誰かがまったく同じ問題を再現するのに使うことができる)、あなたはそうした可能性を指摘することはできません。しかし、ファイルが正しく読み込まれていると検証され、文字列の '.size()'がゼロを返す場合、あなたの検証方法には欠陥があると考えられます。 – Peter

+0

私は 'x'のすべてのインスタンスを' words [rnd] .size() 'という値に置き換えようとしました。何らかの理由で、それぞれの文字列の長さの値が正しく返されました。明らかに、問題はそれを「x」に割り当てることであった。 –

関連する問題