0

我正在尝试使用 fgetc 进行单词搜索。我了解 fgetc 的作用,但我遇到了段错误。在运行 gdb 测试时,我返回以下内容。有没有更简单的方法来实现搜索功能?我是编程新手。感谢您的帮助。

#0  0x00007ffff7aa4c64 in getc () from /lib64/libc.so.6
#1  0x000000000040070c in main ()

我哪里错了?

#include <stdio.h>
#include <stdlib.h>
int isAlpha(char c)
{
    if( c >= 'A' && c <='Z' || c >= 'a' && c <='z' || c >= '0' && c <= '9' )
    {
        return 1;        
    }
    else
    {
        return 0;
    }
}

int CheckFunctionn(int length, int message_counter, char ref_word[], char newmessage[])
{
    int newCounter = 0;
    int counterSuccess = 0;

    while(newCounter < length)
    {
        if(ref_word[newCounter] == newmessage[newCounter + message_counter])
        {
            counterSuccess++;
        }
        newCounter++;
    }

    if(counterSuccess == length)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int main(int argc, char *argv[])
{
    char message[300];
    int counter = 0;
    int ref_length = 0;
    int alphaCounter = 0;
    int alphaCounterTime = 0;
    int messageCounter = 0;
    int word_counter = 0;

    FILE* input;
    FILE* output;

    //long fileLength;
    //int bufferLength;
    //char readFile;
    //int forkValue;

    input = fopen(argv[2],"r");
    output = fopen(argv[3],"w");

    int c;
    c = fgetc(input);

    while(c != EOF)
    {
        while((argv[1])[ref_length] !='\0')
        {
            // if string is "HEY", (argv[1]) is HEY, ref_counter is the length
            // which in this case will be 3.
            ref_length++; //<-- takes care of the length.
        }

        while(alphaCounter < ref_length)
        {
            // this will add to alphaCounter everyetime alphaCT is success.
            alphaCounterTime += isAlpha((argv[1])[alphaCounter]);
            alphaCounter++;
        }

        if(alphaCounterTime != ref_length)
        {
            return 0;
        }

        if((messageCounter == 0 ) && (message[messageCounter + ref_length] == ' ' || message[messageCounter] == '\n' || message[messageCounter]== '\t')) // counts the whole things and brings me to space
        {
            // compare the message with the word
            word_counter += CheckFunctionn(ref_length, messageCounter, argv[1], message);
        }

        if((message[messageCounter] == ' ' || message[messageCounter] == '\n' || message[messageCounter]== '\t')  && (message[messageCounter +  ref_length + 1] == ' ' || message[messageCounter + ref_length + 1] == '\n' || message[messageCounter + ref_length + 1]== '\t'))
        {
            word_counter += CheckFunctionn(ref_length, messageCounter + 1, argv[1], message);
        }

        if((message[messageCounter]== ' '|| message[messageCounter] == '\n' || message[messageCounter]== '\t') && (messageCounter + ref_length+1)== counter) //<-- this means the length of the message is same
        {
            word_counter += CheckFunctionn(ref_length, messageCounter + 1, argv[1], message);
        }

        messageCounter++;        
    }
    fclose(input);
    fclose(output);
    return 0;
}
4

4 回答 4

2

您几乎可以肯定无法打开输入文件。如果fopen失败,则返回NULL,并且调用fgetc(NULL)具有未定义的行为,分段错误是未定义行为的一种可能结果。

您需要检查错误并相应地处理。您还需要检查您的程序是否有足够的参数。这是处理它们的一种方法:

if (argc < 3)
{
    fprintf(stderr, "Usage: %s input-file output-file\n", argv[0]);
    exit(1);
}

input = fopen(argv[1],"r");
if (input == NULL)
{
    fprintf(stderr, "Error opening input file %s: %s\n", argv[1], strerror(errno));
    exit(1);
}

output = fopen(argv[2],"w");
if (output == NULL)
{
    fprintf(stderr, "Error opening output file %s: %s\n", argv[2], strerror(errno));
    exit(1);
}
于 2013-04-16T22:50:47.473 回答
1

您只需将一个字符读入c, 然后循环while(c != EOF),这几乎总是一个无限循环。在那个循环中,你增加messageCounter你用来走过数组末端的那个——繁荣!

于 2013-04-16T22:47:33.587 回答
0

根据您的评论,argc是 2,但您指的是 argsargv[2]第三个元素,并且是NULL. 最终也会FILE *成为NULL(因为传递NULL给是无效的fopen)。

于 2013-04-16T22:51:19.293 回答
-1

如果您strcmp在此使用函数将非常容易...

你需要做的是首先找到你的文件的长度,ftell然后分配那么多内存,然后使用fgetcfgets或任何其他文件函数填充该内存......然后只使用strcmp函数......宾果游戏!!!! !:)

于 2013-04-17T04:47:42.147 回答