我有一个结构定义为;
struct player {
int no, age;
char name[20];
} players[10];
从文件中填充数组。我尝试做的是,从用户获取输入,将输入添加到char数组,将其发送到搜索(char lookup [])函数和循环中的strstr
名称字段。
EDİT:对不起,我更正了订单。我正试图在一个循环中进行strstr。
char *p = strstr(players[x].name, inputFromUser);
但p
始终为空。我怎么能这样做?
提前致谢。
编辑 - 已添加代码...
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
struct player {
int no, age;
char name[20];
} players[20];
void fillstruct(char *);
void search(char []);
int main(int argc, char *argv[])
{
int arg;
int c;
int d;
int i=0;
char a[100];
char *filename = NULL;
while((arg=getopt(argc, argv, "f:"))!=-1)
{
switch(arg)
{
case 'f':
filename = optarg;
fillstruct(filename);
break;
default:
break;
}
}
while((c=fgetc(stdin))!=EOF)
{
if(c!=10)
{
a[i]=c;
i++;
}
else
{
a[i]='\0';
search(a);
i=0;
}
}
return 0;
}
void search(char a[])
{
int i=0;
int col;
int found=0;
char *p =NULL;
while((i<20)&&(found==0))
{
p = strstr(a, players[i].name);
if(p)
{
col = p-a;
printf("\nPlayer '%s' found in '%s'.. Found index: %d", a, players[i].name, col);
found=1;
}
else
{
printf("\np=%s a=%s player[%d].name=%s", p, a, i, players[i].name);
}
i++;
}
}
void fillstruct(char *name)
{
FILE *fp;
char line[100];
int i=0;
fp = fopen(name, "r");
if(fp==NULL)
{
exit(1);
}
while(fgets(line, 100, fp)!=NULL)
{
players[i].no=i;
strcpy(players[i].name, line);
fprintf(stdout, "\nplayer=%s", players[i].name);
players[i].age=20;
i++;
}
fclose(fp);
}
答案 0 :(得分:2)
添加了mic_e
建议的答案假设您尝试使用来自用户的输入搜索玩家名称,则以相反的顺序使用strstr的参数。另请注意,strstr区分大小写。
char * p = strstr(players [x] .name,inputFromUser);
答案 1 :(得分:0)
像这样:
char *p = strstr(players[x].name, inputFromUser);
答案 2 :(得分:0)
它应该有用,如果输入错误就会失败,让我简单地说出来
int main()
{
char *ret;
char mystr[]="stack";
char str[]="This is stack over flow string";
ret = strstr(str, mystr);
printf("The substring is: %s\n", ret);
return(0);
}
输出
The substring is: stack over flow string
这意味着
此函数返回指向str
中指定的任何整个字符序列的mystr
中第一次出现的指针,如果str
中没有该序列,则返回空指针
区分大小写的功能意味着如果尝试搜索
char mystr[]="Stack";//Note here first char is capital
你的输出就像
The substring is: (null)
您只需打印内容并验证其是否正确,即可检查您身边的输入和目标字符串。
printf("str1:%s str2:%s\n",players[x].name,inputFromUser)
char *p = strstr(players[x].name, inputFromUser);
我希望这清楚你的怀疑。
答案 3 :(得分:0)
应该工作。
我认为您有文件读取问题,这会填满数据数组。
请确保您填入结构的数据正常。
并且strstr返回string2中string1的第一次出现的地址 哪里, strstr(string2,string1);
答案 4 :(得分:0)
fgets
存储\n
,然后停止接受输入。
假设玩家名称为"user"
,players[i].name
等于"user\n"
而a
为"user"
。
因此strstr
的返回始终为NULL
。
请改为尝试:
p = strstr(players[i].name,a);
或者,在\n
之后从文件中输入后删除fgets
:
while(fgets(line, 100, fp)!=NULL)
{
players[i].no=i;
strcpy(players[i].name, line);
players[i].name[strlen(players[i].name)-1]='\0'; //add this line
fprintf(stdout, "\nplayer=%s", players[i].name);
players[i].age=20;
i++;
}