此代码返回子字符串位置,但我担心gets
被弃用,并且我应该使用fgets
,但我真的不明白如何使用它与指针,因为我已经尝试使用fgets
格式的gets
和我得到编译器警告。
这个功能:
#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 ("%dn", pch - str);
return 0;
}
这是我如何使用fgets
:
fgets(str, 100, pch);
fgets(str2, 100, pch);
gets()
已被弃用,因为它不使用size参数来指定从stdin
流读取的最大字节数。足够长的输入行将导致未定义的行为,因为gets()
将写入超出目标数组的末尾:这被认为是一个主要的安全漏洞,因此该函数最终从最近的C标准版本(从C11开始)中删除。请不要使用此功能。
fgets()
应该用作替换:您的错误是第三个参数是输入流,在您的情况下是stdin
。编译器报错pch
的类型
请注意,与gets()
不同,fgets()
将换行符存储在缓冲区的末尾,如果大小允许,因此必须在测试它是否出现在第一个字符串中之前从第二个字符串中删除它。
还请注意,pch - str
的类型ptrdiff_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")] = ' '; // strip the trailing newline if any
pch = strstr(str, str2);
if (pch != NULL) {
printf("%dn", (int)(pch - str));
}
return 0;
}