1

私はこの問題をしばらく抱えていて、このタイプのエラーについて検索しましたが、メモリリークまたは何も指していないポインターに関係していると思います。

コードを何度もチェックしましたが、デバッグ方法がわからないため、この問題が発生している場所を正確に見つけることができません。コードの最初の行にブレークポイントを設定しようとしても、クラッシュします。

ファイルから一連のISBNを読み取り、それらが有効かどうかを確認しています。

数が多いように見えるかもしれませんが、ロジックは非常に単純です。

これが私のコードです:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <list>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <vector>

using namespace std;

class Isbn
{
   private:
   string isbnCode;

   public:

   Isbn()
   {            
   }

   Isbn(string isbn): isbnCode(isbn)
   {               
   }

   ~Isbn()
   {              
   }

   string getIsbn()
   {
      return isbnCode;
   }

   void setIsbn(string input)
   {
      isbnCode = input;
   }
};

void setListOfIsbn(const string filename, list<Isbn> &listOfIsbn);
void validateIsbns(const list<Isbn> listOfIsbn, list<bool> &validations);
void printValidations(const list<Isbn> listOfIsbn, 
     const list<bool> validations);
string bToS(const bool bValue);

int main(int argc, char *argv[])
{
   list<Isbn> listOfIsbn;
   list<bool> validations;

   string inputFile = argv[1];

   setListOfIsbn(inputFile, listOfIsbn);
   validateIsbns(listOfIsbn, validations);
   printValidations(listOfIsbn, validations);

   return 0;
}

void setListOfIsbn(const string filename, list<Isbn> &listOfIsbn)
{
   list<Isbn>::const_iterator iterator;

   ifstream fin; 

   fin.open(filename.c_str()); 
   char ch;
   string isbnCode;

   while (!fin.eof()) 
   { 
      fin.get(ch);

      if (ch == '\n')
      {
         Isbn isbn;

         (isbn).setIsbn(isbnCode);
         listOfIsbn.push_back(isbn);
         isbnCode = "";         
      }
      else
      {
         isbnCode.append(reinterpret_cast<const char*>(ch));
      }
   } 
}

void validateIsbns(const list<Isbn> listOfIsbn, list<bool> &validations)
{
   list<Isbn>::const_iterator itr;

   for (itr = listOfIsbn.begin(); itr != listOfIsbn.end(); itr++)
   {
      Isbn isbn = *itr;
      string isbnCode = isbn.getIsbn();
      string isbnCodeReform = "";
      vector<int> products;
      int sumOfProducts = 0;
      unsigned int i;

      for (i = 0; i < isbnCode.length(); itr++)
      {
         if(isalnum(isbnCode[i]))
         {
            isbnCodeReform[i] = isbnCode[i];
         }
      }

      for (i = 0; i < (isbnCodeReform.length() - 1); itr++)
      {
         if(isbnCodeReform[i] == 'X')
         {
            isbnCodeReform[i] = 10;
         }         

         products[i] = isbnCodeReform[i] * (10 - i);      
      }

      vector<int>::const_iterator itr;

      for (itr = products.begin(); itr != products.end(); itr++)
      {
         sumOfProducts += products[*itr];
      }

      if ((sumOfProducts % 11) == 0)
      {
         validations.push_back(true);
      }
      else
      {
         validations.push_back(false);
      }
   }
}

void printValidations(const list<Isbn> listOfIsbn, 
     const list<bool> validations)
{
   list<Isbn>::const_iterator itr;
   list<bool>::const_iterator itr2 = validations.begin(); 

   for(itr = listOfIsbn.begin(); itr != listOfIsbn.end(); itr++)
   {
      string validate = bToS(*itr2);
      Isbn isbn = *itr;
      cout << isbn.getIsbn() + ": " + validate + "\n";
      itr2++;
   }
}

string bToS(const bool bValue)
{
   if(bValue == 0)
   {
      return "False";
   }
   else
   {
      return "True";
   }
}

どんな助けでも大歓迎です!

4

2 に答える 2

0

ここでエラーが発生します:

     isbnCode.append(reinterpret_cast<const char*>(ch));

文字 (ほとんどの場合数字) を a にキャストする場所const char *- したがって、ポインタとして使用される文字の値があります。メモリアクセスチェックがまったくないシステムでは、これはほぼ確実に失敗します。

文字列に文字を追加する必要があります。最も簡単な方法は次のとおりです。

     isbnCode += ch; 
于 2013-05-04T15:16:33.470 に答える