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
的typeptrdiff\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;
}