所以我的代码无效......
test.c:27: warning: passing argument 1 of ‘search’ from incompatible pointer type
这是fgets行。
我的代码打开一个文件,逐行读取文件,我正在尝试创建一个“搜索”函数,它将返回一个值,指示是否在文件的该行找到该字符串。
我的最终目标是实现搜索和替换程序。但是一步一步呃? 这就是我到目前为止所做的:
#include <stdio.h>
#include <string.h>
int search(const char *content[], const char *search_term)
{
int t;
for(t=0; content[t]; ++t){
if(!strcmp(content[t], search_term)){
return t; // found
}
}
return 0; // not found
}
int main(int argc, char *argv[])
{
FILE *file;
char line[BUFSIZ];
int linenumber=0;
char term[20] = "hello world";
file = fopen(argv[1], "r");
if(file != NULL){
while(fgets(line, sizeof(line), file)){
if(search(line, term) != -1){
printf("Search Term Found!!\n");
}
++linenumber;
}
}
else{
perror(argv[1]);
}
fclose(file);
return 0;
}
答案 0 :(得分:3)
更改
int search(const char *content[], const char *search_term)
到
int search(const char content[], const char *search_term)
编辑:
同样改变:
if(!strcmp(content[t], search_term)){
到
if(!strcmp(&content[t], search_term)){
或
if(!strcmp(content + t, search_term)){
由于您使用strcmp
来查找匹配项,因此您无法在该文件中找到所有出现的搜索字符串。您只会在search_string中找到 end 的那些行。
示例:您的搜索字符串为“hello world
”,并说该文件有2
行:
I wrote hello world
hello world is good
在这种情况下,您的程序将只能找到第一次出现而不是第二次出现。
即使找到了这个匹配项,您的代码也需要进行一些更改:
fgets
读取的字符串有一个尾随换行符,你必须像它一样摆脱它:
while(fgets(line, sizeof(line), file)){
line[strlen(line)-1] = 0;
如果搜索失败,您将返回0
,应将其更改为-1
。
答案 1 :(得分:2)
如果我理解正确,你只是以非常低效的方式重新实现strstr()libc函数。
答案 2 :(得分:2)
参数类型:
const char *content[]
不正确。使用:
const char *content
/
#include <stdio.h>
#include <string.h>
int search(const char *content, const char *search_term)
{
int t;
for(t=0; content+t; ++t){
if(!strcmp(content[t], search_term)){
return t; // found
}
}
return 0; // not found
}
int main(int argc, char *argv[])
{
FILE *file;
char line[BUFSIZ];
int linenumber=0;
char term[20] = "hello world";
file = fopen(argv[1], "r");
if(file != NULL){
while(fgets(line, sizeof(line), file)){
if(search((const char*)line, term) != -1){
printf("Search Term Found!!\n");
}
++linenumber;
}
}
else{
perror(argv[1]);
}
fclose(file);
return 0;
}
答案 3 :(得分:1)
试试这个:
int search(const char *content, const char *search_term)
答案 4 :(得分:1)
content[t]
的地址传递给strcmp
。 content[t]
是一个字符,而不是字符串。我认为你还有其他一些问题。例如return 0;
- 也许是return -1
?
此外......我认为您可能需要使用strncmp
来查找该行中的字词。
例如
int search(char *content, const char *search_term)
{
int t;
for(t=0; content[t]; ++t){
if(!strncmp(&content[t], search_term, strlen(search_term))){
return t; // found
}
}
return -1; // not found
}
答案 5 :(得分:0)
请尝试使用此方法:
int search(const char *content, const char *search_term)
{
char *result = strstr(content, search_term);
if(result == NULL) return 0;
return (int)(result - content);
}
result
和content
之间的差异正是找到结果的索引。我相信这就是你要找的东西?
我认为虽然有改进的余地。您不希望在不匹配时返回0
,因为在第一个字节位置(也是0
)的匹配可能会混淆。相反,如果必须返回一个整数,则返回-1
:
if(result == NULL) return -1;
然而,更进一步,你可以看到这个方法如何只是你以后甚至没有使用的功能的包装器。如果您在main
中关心的是否找到了字符串,只需完全删除此函数并写下main
,如下所示:
int main(int argc, char *argv[])
{
FILE *file;
char line[BUFSIZ];
int linenumber = 1;
char term[20] = "hello world";
file = fopen(argv[1], "r");
if(file != NULL) {
while(fgets(line, sizeof(line), file)){
if(strstr(line, term) != NULL) {
printf("Search Term Found at line %d!\n", linenumber);
}
++linenumber;
}
}
else {
perror(argv[1]);
}
fclose(file);
return 0;
}