字符串搜索命令提示符的C程序

时间:2014-04-15 16:21:19

标签: c string

我编写了搜索字符串的C程序。问题是MyStrstr()函数不起作用 命令提示符。它只适用于IDE。那么,任何人都可以建议我如何修复使用命令提示符的代码。关于......

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define ARGUMENT_COUNT   3              
#define FILE_INDEX       2              
#define SEARCH_INDEX     1              
#define BUFFER           256
#define SUCCESS          0
#define ERRCODE_PARAM    1              
#define ERRCODE_FILENAME 2              
#define MSG_USAGE       "String Search Program === EXER5 === by Newbie\nUsage: %s Search_String fileName"
#define MSG_ERROR       "Can not open file. [%s]"

char* MyStrstr(char* pszSearchString, char* pszSearchWord);

int main(int argc, char* argv[])
{
    FILE* pFile = NULL;                 
    char szData[BUFFER];
    char* pszCutString = NULL;

    if(argc != ARGUMENT_COUNT) {
        printf(MSG_USAGE, argv[0]);     
        return ERRCODE_PARAM;
    }

    pFile = fopen(argv[FILE_INDEX], "r");
    if(pFile == NULL) {         
        printf(MSG_ERROR, argv[FILE_INDEX]);
        return ERRCODE_FILENAME;
    }

    pszCutString = MyStrstr(szData, argv[SEARCH_INDEX]);
    if(pszCutString != NULL) {
        printf("%s", pszCutString); 
    }

    fclose(pFile);
    pFile = NULL;
    return SUCCESS;
}    

char* MyStrstr(char* pszSearchString, char* pszSearchWord) {

    int nFcount = 0;                    
    int nScount = 0;                    
    int nSearchLen = 0;
    int nIndex = 0;
    char* pszDelString = NULL; 
    char cSLen = 0;
    size_t len = 0;

    if(pszSearchString == NULL || pszSearchWord == NULL)   {
        return NULL;
    }   

    while(pszSearchWord[nSearchLen] != '\0') {
        nSearchLen++;
    }                               
    if(nSearchLen <= 0){
        return pszSearchString;
    }

    cSLen = *pszSearchWord++;
    if (!cSLen) {
        return (char*) pszSearchString;
    }

    len = strlen(pszSearchWord);

    do {
        char cMLength;
        do {
            cMLength = *pszSearchString++;
            if (!cMLength)
                return (char *) 0;
        } while (cMLength != cSLen);
    } while (strncmp(pszSearchString, pszSearchWord, len) != 0);
    return (char *) (pszSearchString - 1);  
}

1 个答案:

答案 0 :(得分:1)

您想要打开文件,在该文件的内容中搜索字符串并返回/打印该文件。你正在做:

char szData[256];          // <-- making an uninitialized buffer
char* pszCutString = NULL;

pFile = fopen(argv[2], "r");              // <-- Opening a file
pszCutString = MyStrstr(szData, argv[1]); // <-- searching the buffer
if(pszCutString != NULL) {
    printf("%s", pszCutString); 
}
fclose(pFile);        // <-- Closing the file

因此,您永远不会使用szData中记录的文件内容填充您的缓冲区argv[2]。您正在尝试在未初始化的缓冲区中搜索字符串。你好运,结果只是&#34;没有输出出现&#34;。

您需要在argv[2]中获取文件的内容并将其放在缓冲区szData中,然后进行搜索。这可以通过添加对read()fscanf()

等函数的调用来完成

注1:
我假设当你说这个&#34;工作&#34;在IDE中,代码有点不同,并且您没有使用命令行参数。

注2:
在尝试读取/关闭fopen()之前,您还应该检查pFile工作,如果您的文件可能大于256个字符,则需要将代码更改为具有动态大小的字符串,或者你需要循环缓冲区填充(但是你必须担心分开一个单词),或者其他一些机制来检查整个文件。