Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用fgets进行子字符串搜索_C - Fatal编程技术网

C 使用fgets进行子字符串搜索

C 使用fgets进行子字符串搜索,c,C,这段代码返回子字符串位置,但我担心get被弃用,我应该使用fgets,但我真的不知道如何将其与指针一起使用,因为我尝试对get和get使用fgets格式,并收到编译器警告 这一个是功能性的: #include <stdio.h> #include <string.h> int main() { char str[100]; char str2[100]; char *pch; gets(str); gets(str2);

这段代码返回子字符串位置,但我担心
get
被弃用,我应该使用
fgets
,但我真的不知道如何将其与指针一起使用,因为我尝试对
get
get使用
fgets
格式,并收到编译器警告

这一个是功能性的:

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

int main() {
    char str[100];
    char str2[100];
    char *pch;

    gets(str);
    gets(str2);

    pch = strstr(str, str2);

    if (pch != NULL)
        printf ("%d\n", pch - str);

    return 0;
}
gets()
已被弃用,因为它不使用size参数来指定从
stdin
流读取的最大字节数。足够长的输入行将导致未定义的行为,因为
get()
将写入目标数组的末尾之外:这被认为是一个主要的安全缺陷,因此此函数最终已从最新版本的C标准(C11)中删除。请勿使用此功能

fgets()
应该用作替换:您的错误是第三个参数是输入流,
stdin
。编译器抱怨
pch
的类型错误

请注意,与
gets()
不同,
fgets()
在大小允许的情况下将换行符存储在缓冲区的末尾,因此在测试第一个字符串中是否存在换行符之前,必须将其从第二个字符串中删除

还要注意的是,
pch-str
的type
ptrdiff\u t
可能不同于
int
,您必须将其转换为
(int)
,作为
%d
printf
参数,或者在C99兼容系统上使用
%td

下面是一个简单的方法:

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

int main() {
    char str[100];
    char str2[100];
    char *pch;

    // read 2 strings from stdin:
    // fgets takes an array, its size and a stream as arguments
    // it returns a pointer to the destination array if successful
    // it returns NULL at end of file or upon a read error.
    if (!fgets(str, sizeof str, stdin))
        return 1;

    if (!fgets(str2, sizeof str2, stdin))
        return 1;

    str2[strcspn(str2, "\n")] = '\0';  // strip the trailing newline if any

    pch = strstr(str, str2);

    if (pch != NULL) {
        printf("%d\n", (int)(pch - str));
    }
    return 0;
}
#包括
#包括
int main(){
char-str[100];
char-str2[100];
char*pch;
//从stdin读取2个字符串:
//fgets将数组、数组大小和流作为参数
//如果成功,它将返回指向目标数组的指针
//它在文件末尾或读取错误时返回NULL。
如果(!fgets(str,sizeof str,stdin))
返回1;
如果(!fgets(str2,str2的大小,stdin))
返回1;
str2[strcspn(str2,“\n”)]='\0';//如果有,去掉尾随的换行符
pch=strstr(str,str2);
如果(pch!=NULL){
printf(“%d\n”,(int)(pch-str));
}
返回0;
}

需要一个打开的、可读的
文件*
(因此
f
)。我无法理解在替换那些
fgets
调用时,发布的代码如何不发出警告(如果不是完全错误的话)。@WhozCraig实际上
fgets(str2100,pch)
仅发出警告,即使它实际上是一个错误。
gets
不再被弃用,因为它从C11(正式,ISO/IEC 9899:2011)起就被完全从C标准中删除。@M.NejatAydin:好的观点。答案经修正。大多数编译器只是抱怨不赞成,因为默认情况下它们支持旧版本的标准。
#include <stdio.h>
#include <string.h>

int main() {
    char str[100];
    char str2[100];
    char *pch;

    // read 2 strings from stdin:
    // fgets takes an array, its size and a stream as arguments
    // it returns a pointer to the destination array if successful
    // it returns NULL at end of file or upon a read error.
    if (!fgets(str, sizeof str, stdin))
        return 1;

    if (!fgets(str2, sizeof str2, stdin))
        return 1;

    str2[strcspn(str2, "\n")] = '\0';  // strip the trailing newline if any

    pch = strstr(str, str2);

    if (pch != NULL) {
        printf("%d\n", (int)(pch - str));
    }
    return 0;
}