我得到了这个奇怪的运行时错误,我不知道如何解决这个问题,我相信这对我有用,它一度是一个一致性程序,它接受一个txt文件中的每个单词并按顺序排除副本使用二叉搜索树。首先我不得不放入#define _CRT_SECURE_NO_DEPRECATE
,因为fopen已经贬值了,它给我的alt(s_fopen)不起作用。下面发布的是我的Main和其他3个函数(一个用于在我的表中插入,一个用于打印我的表,另一个用于清空它)以及调试器告诉我的内容。另外我的主要是从unix命令行中获取表大小和txt文件。
#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;
}
}
这是调试器所说的:
CunixProgAssign2ProgTest.exe中的0x0F85C311(ucrtbased.dll)抛出异常:0xC0000005:访问冲突读取位置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
答案 0 :(得分:2)
这:shell将<
解释为输入重定向。它导致input.txt
的内容被输入stdin
。这也意味着您的计划的唯一参数是15
。所以argv[3]
没有指向任何东西,导致崩溃。
您可以这样称呼它:
./concordance 15 not_used input.txt
由于未使用argv[2]
,您可以在其中放置任意字符串。
要做的最好的事情是检查argc
是否足够大,并且可能让程序从argv[2]
读取文件名。