新人对findstr函数不懂,求教大神

时间:2022-07-17 13:53:10
在编写c程序的时候看到两个函数概念,一个是f /str/:显示匹配str的文本行,另一个是f /str/g:显示匹配str的所有文本行
但是搞不懂这两个分别要怎么编写
示例函数如下:
/* 在字符串line中寻找子字符串sub的函数							*/
/* 返回值表示子字符串sub在line中的位置(字符数组下标) */
/* 返回值为EOF,表示在字符串line中不存在子字符串sub */
/* 主调函数:findStr(), deleteLine(), replaceStr() */
int substr(char *line, char *sub) /* 寻找子字符串的函数 */
{
int istr, isub, ichar=0;
for( ; line[ichar]; ichar++)
{
for(istr=ichar, isub=0;
sub[isub] != '\0' && line[istr] == sub[isub];
istr++, isub++)
;
if(sub[isub] == '\0')
return(ichar);
}
return(EOF);
}

void findStr(void) /* 搜索字符串的函数 */
{
TEXT *node;
int fail=1; /* 0:完成操作; 1:无法完成操作 */
if(Head == NULL || Head->next == NULL)
{
printf("搜索字符串错误:文本文件为空\n");
return;
}
if(numStr == 0)
{
printf("搜索字符串错误:未指定搜索字符串\n");
return;
}
else if(numStr == 2 && cmdStr[1][0] != 'g')
{
printf("搜索字符串错误:非法匹配模式: %s\n", cmdStr[1]);
return;
}
else if(numStr == 3 && cmdStr[1][0] == '\0')
{
printf("搜索字符串错误:非法匹配模式: /%s/%s/%s\n",
cmdStr[0], cmdStr[1], cmdStr[2]);
return;
}
else if(numStr == 1)
{
/* ----请补齐以下程序,实现搜索命令"f /str/"的功能------ */
printf("显示匹配%s的文本行\n", cmdStr[0]);

/* ------------------请补齐以上程序-------------------- */
}
else if(numStr == 2 && cmdStr[1][0] == 'g')
{
/* ----请补齐以下程序,实现搜索命令"f /str/g"的功能----- */
printf("显示匹配%s的所有文本行\n", cmdStr[0]);


/* ------------------请补齐以上程序-------------------- */
}
else
{
printf("搜索字符串错误:非法匹配模式: /%s/%s%s\n",
cmdStr[0], cmdStr[1], cmdStr[2]);
return;
}
if(fail)
printf("搜索字符串失败:未能匹配指定的字符串%s\n", cmdStr[0]);
}


其中两个需要补齐的空格我编写了好几次都编译失败了,是不是需要用到for()?又要如何引用substr这个函数呢?
恳请大神解答,对这类编写实在没有头绪,身边又没有会这类c程序的同好

7 个解决方案

#1


https://technet.microsoft.com/en-us/library/bb490907.aspx

#2


if(numStr == 0) 

这里直接引用 substr  函数 即可

#3


能把main函数也出来吗?

#4


C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\strstr.c
/***
*strstr.c - search for one string inside another
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines strstr() - search for one string inside another
*
*******************************************************************************/

#include <cruntime.h>
#include <string.h>

/***
*char *strstr(string1, string2) - search for string2 in string1
*
*Purpose:
*       finds the first occurrence of string2 in string1
*
*Entry:
*       char *string1 - string to search in
*       char *string2 - string to search for
*
*Exit:
*       returns a pointer to the first occurrence of string2 in
*       string1, or NULL if string2 does not occur in string1
*
*Uses:
*
*Exceptions:
*
*******************************************************************************/

char * __cdecl strstr (
        const char * str1,
        const char * str2
        )
{
        char *cp = (char *) str1;
        char *s1, *s2;

        if ( !*str2 )
            return((char *)str1);

        while (*cp)
        {
                s1 = cp;
                s2 = (char *) str2;

                while ( *s1 && *s2 && !(*s1-*s2) )
                        s1++, s2++;

                if (!*s2)
                        return(cp);

                cp++;
        }

        return(NULL);

}

#5


ms写的这个strstr简洁,但不高效

#6


引用 5 楼 zhangxiangDavaid 的回复:
ms写的这个strstr简洁,但不高效

这个请问怎样写高效

#7


引用 6 楼 bjym1987 的回复:
Quote: 引用 5 楼 zhangxiangDavaid 的回复:

ms写的这个strstr简洁,但不高效

这个请问怎样写高效

字符串的查找可以使用KMP之类的算法

#1


https://technet.microsoft.com/en-us/library/bb490907.aspx

#2


if(numStr == 0) 

这里直接引用 substr  函数 即可

#3


能把main函数也出来吗?

#4


C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\strstr.c
/***
*strstr.c - search for one string inside another
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines strstr() - search for one string inside another
*
*******************************************************************************/

#include <cruntime.h>
#include <string.h>

/***
*char *strstr(string1, string2) - search for string2 in string1
*
*Purpose:
*       finds the first occurrence of string2 in string1
*
*Entry:
*       char *string1 - string to search in
*       char *string2 - string to search for
*
*Exit:
*       returns a pointer to the first occurrence of string2 in
*       string1, or NULL if string2 does not occur in string1
*
*Uses:
*
*Exceptions:
*
*******************************************************************************/

char * __cdecl strstr (
        const char * str1,
        const char * str2
        )
{
        char *cp = (char *) str1;
        char *s1, *s2;

        if ( !*str2 )
            return((char *)str1);

        while (*cp)
        {
                s1 = cp;
                s2 = (char *) str2;

                while ( *s1 && *s2 && !(*s1-*s2) )
                        s1++, s2++;

                if (!*s2)
                        return(cp);

                cp++;
        }

        return(NULL);

}

#5


ms写的这个strstr简洁,但不高效

#6


引用 5 楼 zhangxiangDavaid 的回复:
ms写的这个strstr简洁,但不高效

这个请问怎样写高效

#7


引用 6 楼 bjym1987 的回复:
Quote: 引用 5 楼 zhangxiangDavaid 的回复:

ms写的这个strstr简洁,但不高效

这个请问怎样写高效

字符串的查找可以使用KMP之类的算法