【问题标题】:why my program "creating index" doesn't work?为什么我的程序“创建索引”不起作用?
【发布时间】:2013-12-03 19:28:40
【问题描述】:

我正在编写一个程序,该程序将文本文件作为输入,对其单词进行索引,并将输出(索引)打印到文件和屏幕中。我的代码如下所示,尝试了很多方法来发现问题或至少缩小范围,但我做不到。如果有人可以帮助或发现语法或代码逻辑方面的问题,我会很高兴知道。

void main(int argc, char * argv[])
{   
    //clearscreen
    clrscr();

//if arguments are less that default of the program
if (argc < 2) 
{
    cout << "You should've input 3 arguments." ;
    return;
}

//opening the input file and defining a pointer which points to it as argv[1]
FILE *fPtr = fopen(argv[1], "r+");

//defining a 2D array to hold maximum to 200 words holding maximum to 20 characters
char words[200][20];

//initializing words 2D array with zero ASCII
for(int i = 0; i < 200; i++)
    for(int j = 0; j < 20; j++)
        words[i][j] = 255;

//defining an 2D whi array which is supposed to show how many times words are placed in which lines in a defined layout
//it holds maximum to 200 words holding maximum 100 sentences
int index[200][100];

//initializing the index 2D array with zero ASCII
for(i = 0; i < 200; i++)
    for(j = 0; j < 100; j++)
        index[i][j] = 0;

//this array of characters max to 2000 is supposed to hold each line which is gotten with fgets
char buff[2000];

//initializing the buff array with zero ASCII
for(i = 0; i < 2000; i++)
    buff[i] = 0;

//the max of the words used in the source file is 200. but this valuable named as 'last' says how many words are used in this source file
//its initalized as no words is held
int last = 0;

//defining a pointer to char of punctuation mark characters. all ASCII codes expect for a - z, A - Z, 0 - 9 and newline
char *punc;

//initializing punctuation marks array
for(i = 0; i < 256; i++)
{
    if(i == 10)
        continue;
    if(i >= '0' && i <= '9')
        continue;
    if(i >= 'a' && i <= 'z')
        continue;
    if(i >= 'A' && i <= 'Z')
        continue;
    char *string = (char *) &i;
    strncat(punc, string, 1);
}

//how many lines is read from the source file
int lineread = 0;

//a word which the processes are done on that
char *word;

//one line read
while( fgets(buff, 1999, fPtr) != NULL)
{
    //how many words is read from the source file in the current line
    int wordread = 0;

    word = strtok(buff, punc);

    //one word read
    while( word != NULL)
    {
        //sorting
        int k = 0;
        while(strcmp(word, words[k])> 0)
            k++;
        if(strcmp(word, words[k]))
        {

            for(int l = last; l >= 0; l--)
            {
                strcpy(words[l + 1],words[l]);
                for(int o = 0; o <= lineread; o++)
                    index[l + 1][o] = index[l][o];
            }
            last++;
            strcpy(words[k],word);
            for(l = 0; l <= lineread; l++)
                index[k][l] = 0;
        }
        index[k][lineread]++;
        wordread++;//go to next word
        word = strtok(NULL, punc);
    }
    lineread++;//go to next line
}
//closing the input file
fclose(fPtr);

//opening the output file and defining a pointer which points to it as argv[2]
FILE *fPtr2 = fopen(argv[2], "w+");

//showing the index in cmd
for(i = 0; i <= last; i++)
{   
    printf("%-20s" , words[i]);
    fprinf(fPtr2, "%-20s" , words[i]);
    int m = 0;
    for(j = 0; j <= lineread; j++)
    {
        if(m)
        {
            printf("%c", ',');
            fprintf(fPtr2, "%c", ',');
        }
        if(index[i][j])
        {
            printf("%i", j + 1);
            fprintf(fPtr2, "%i" ,j + 1);
        }
        if(index[i][j] > 1)
        {       
            printf("(%i)", index[i][j]);
            fprintf(fPtr2, "(%i)", index[i][j]);
                m = 1;
        }
    }
    printf("\n");
    fprintf(fPtr2, "\n");
}

//closing the output file
fclose(fPtr);
}

现在它错误为异常程序终止 NULL 指针分配。我必须使用 turbo c,我使用 DOS SHELL。资源中有一个文件名为“input.txt”。在 DOS SHELL 中我写了这个:

programname.exe input.txt output.txt

如果 input.txt 是我想要的输出:

hello. hello.
how are
you? hello.

desired output:

hello                   1(2),3           //2 times in line 2, 1 time in line 1
how                     2                //1 time in line 2
are                     2               //1 time in line 2
you                     3               //1 time in line 3

【问题讨论】:

  • 我看到你定义了char * punc,但它在进入下一个循环时未初始化,在哪里使用它......不应该将它初始化为指向一些内存吗?
  • 不,那部分工作正常。我之前测试过这部分。
  • 另外,wordsindexbuff 都“用零 ASCII 初始化”,第一个设置为 255,其他设置为 0。我把它当作你的意思是对这三个人做同样的事情。
  • 我真的不知道为什么会这样,我只有 1 小时的时间来做这件事。如果可能,请提供帮助。
  • 如果我们能看到其中一个“错误输出”和相应的“正确输出”,也会有所帮助

标签: c file loops pointers


【解决方案1】:

问题出在这一行:

while(strcmp(word, words[k])> 0)

因为index 被初始化为255 并且根据strcmp 的算法工作,对于第一个单词,代码可以正常工作并将其放入word[0],但对于第二个单词,它将无法正常工作.例如:

first word: Kittens
second word: Biscuits

首先将strcmpKittens255 ASCII code 进行比较。结果是Kitten 更小,进程会将其放入word[0]。但是对于第二个词,strcmpBiscuitsKittens 进行比较,结果是Kittens 更大,程序将遍历另一个不需要的word[] 块。该程序将通过将word[]初始化为0并使用此代码而不是首先提到的代码来修复:

while(strcmp(word, words[k])> 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多