Нарушение прав чтения при попытке strcpy из буфера файлов в массив char - PullRequest
0 голосов
/ 13 ноября 2018

Я работал над заданием для реализации хеширования.В нем я читаю текстовый файл под названием «белки».Проблема возникает, когда я пытаюсь скопировать его в другой массив символов.Visual Studio выдает нарушение прав чтения.

#include <iostream>
#include <fstream>
using namespace std;
struct arrayelement {
  char protein[30];
  int count;
}; 
arrayelement proteins[40];
int main()
{
  char buffer[30];

  // open source file
  ifstream fin("proteins.txt");
  if (!fin) { cerr << "Input file could not be opened\n"; exit(1); }

  // loop through strings in file
  while (fin >> buffer) {
    int index = ((buffer[0] - 65) + (2 * (buffer[strlen(buffer)-1] - 65)) % 40);
    while (true)
    {
        if (proteins[index].protein == buffer)  // Found
        {
            proteins[index].count++;
            break;
        }
        if (proteins[index].protein[0] == 0)    // Empty
        {
            strcpy(proteins[index].protein, buffer); // <-- The error in question
            proteins[index].count++;
            break;
        }
        index++;                                // Collision
     }
  }

  // close file
  fin.close();


  for (int i = 0; i <= 40; i++)
  {
    cout << proteins[i].protein << "\t" << proteins[i].count << "\n";
  }
}

1 Ответ

0 голосов
/ 13 ноября 2018

Если вы получите более 30 символов здесь:

while (fin >> buffer) {

... или если индекс> = 40 здесь:

strcpy(proteins[index].protein, buffer);

... программа, вероятно, аварийно завершит работу (неопределенное поведение). Кроме того, эти char* не будут указывать на один и тот же адрес, поэтому сравнение не удастся:

proteins[index].protein == buffer
...