2015-10-23 3 views
0

Я получаю эту странную ошибку во время выполнения, и я не уверен, как это исправить, я считаю, что это сработало для меня в какой-то момент, это программа согласования, она принимает каждое слово в txt-файле и помещает их для исключения копий с использованием двоичного дерева поиска. сначала мне пришлось положить #define _CRT_SECURE_NO_DEPRECATE, потому что fopen обесценился, и тот, который мне дал (s_fopen), не работал. Ниже перечислены мои основные и 3 другие функции (один для вставки в мою таблицу, один для печати моей таблицы, а другой для ее удаления) и то, что говорит мне отладчик. Также моя основная задача заключается в размере таблицы и txt-файла из командной строки unix.Доступ к данным о нарушении прав доступа 0x73726573

#ifdef _WIN32 
#define _CRT_SECURE_NO_DEPRECATE 
#endif 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

char *Table[60] = { "" }; 

int insert(char *word, char *Table[], int n); 
void empty(char *Table[], int n); 
void print(char *Table[], int n); 

int main(int argc, char **argv) { 


    FILE *file; 
    //position in the buffer 
    int wordPos; 
    //current line 
    int line; 
    //last character read 
    char read[255]; 
    size_t len = 0; 
    //open the file 
    file = fopen(argv[3], "r"); 

    //die if can't open file 
    if (!file) { 
     printf("ERROR: Can't open file %s. \n", argv[1]); 
     exit(1); 
    } 

    int i = 0; 
    int j = 0; 
    int index = 0; 
    //read a char until end of file reached 
    int end = atoi(argv[1]); 
    while ((fgets(read, 100, file)) != NULL) { 
     int k = 0; 
     char word[10]; 
     for (j = 0; read[j] != '\0'; j++) { 
      char x = read[j]; 
      if (read[j] != '\0'&& read[j] != ' ' && read[j] != ',' &&read[j] != '.' && read[j] != '!'&&read[j] != '?' && read[j] != '\n' &&read[j] != ':' && read[j] != ';') { 
       word[k] = tolower(read[j]); 
       k++; 
      } 
      else { 



       if (word[0] != '\0') { 

        index = insert(word, Table, index); 
       } 
       for (k = 0; k<10; k++) { 
        word[k] = '\0'; 
       } 
       k = 0; 



      } 
     } 

    } 
    print(Table, end); 
    empty(Table, index); 
    return 0; 

} 

int insert(char *word, char *Table[], int n) 
{ 
    int index = -1, k; 

    int low = 0, high = n - 1, mid; 

    if (word[0] == ' ') 
     return n; 
    while (low <= high) 
    { 
     mid = low + (high - low)/2; 
     if (strcmp(Table[mid], word) == 0) 
     { 
      index = mid; 
      break; 
     } 
     else if (strcmp(Table[mid], word) < 0) 
      low = mid + 1; 
     else 
      high = mid - 1; 
    } 
    if (index != -1 && index < n) return n; 
    for (index = 0; index < n; index++) 
    { 
     if (strcmp(Table[index], word) < 0) 
      continue; 
     else 
      break; 
    } 
    for (k = n - 1; k >= index; k--) 
    { 
     Table[k + 1] = Table[k]; 
    } 
    Table[index] = _strdup(word); 
    return n + 1; 
} 

void print(char *Table[], int n) 
{ 
    int index; 
    for (index = 0; index < n; index++) 
    { 
     printf("%d: %s\n", index + 1, Table[index]); 
    } 
} 
void empty(char *Table[], int n) 
{ 
    int index; 


    for (index = 0; Table[index]; index++) 
    { 
     free(Table[index]); 
     Table[index] = NULL; 

    } 
} 

Это то, что отладчик говорит:

Exception thrown at 0x0F85C311 (ucrtbased.dll) in CunixProgAssign2ProgTest.exe: 0xC0000005: Access violation reading location 0x73726573.

, когда я смотрю на значение ARGV [3] в отладчике он говорит, что это

  • argv[3] 0x73726573 char *

это то, что моя команда строки выглядят, но это также дает проблему, мое разрешение отрицается, даже если его разрешение равно 777; Я решил, что это потому, что я не могу отладить программу без ошибок.

shell:~> gcc -Wall -o concordance concordance.c 
shell:~> ./concordance 15 < input.txt 

ошибка это дает мне выглядит как этот

./:Permission denied 

Для входов

shell:~> ./concordance 15 < input.txt 

или

shell:~> ./concordance 15 input.txt 
+2

Какова ваша командная строка, чтобы запустить это? –

+0

Извините, плохо отредактируйте и добавьте, что ~~ Просто добавлено – DaCat

+2

Незначительная идея: вместо 'fgets (read, 100, file)', используйте 'fgets (read, 255, file)' или даже лучше 'fgets (read, sizeof read , файл). – chux

ответ

2

Это: < интерпретируется оболочкой как перенаправление ввода. Это приводит к тому, что содержимое input.txt подается в stdin. Это также означает, что единственным аргументом для вашей программы является 15. Таким образом, argv[3] не указывает ни на что, что приводит к сбою.

Вы можете назвать это так:

./concordance 15 not_used input.txt 

Поскольку argv[2] не используется, вы можете поместить любую строку там.

Лучшее, что нужно сделать, это проверить, что argc достаточно большой, и, вероятно, программа будет читать имя файла с argv[2].

+0

Хорошо, дайте мне пару минут, чтобы попробовать это, спасибо – DaCat

+2

Кроме того, проверьте 'argc', чтобы убедиться, что' argv [whatever] 'существует. Классический подход состоит в том, чтобы читать из 'stdin', если' argc == 1' или файл с именем 'argc [1]' в противном случае. – Davislor

+0

@dbush Это, возможно, сработало, но я не могу сказать, потому что я получаю разрешение, когда я пытаюсь передать его таким образом. – DaCat