Я получаю эту странную ошибку во время выполнения, и я не уверен, как это исправить, я считаю, что это сработало для меня в какой-то момент, это программа согласования, она принимает каждое слово в 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
Какова ваша командная строка, чтобы запустить это? –
Извините, плохо отредактируйте и добавьте, что ~~ Просто добавлено – DaCat
Незначительная идея: вместо 'fgets (read, 100, file)', используйте 'fgets (read, 255, file)' или даже лучше 'fgets (read, sizeof read , файл). – chux