struct array中的strstr char数组

时间:2014-04-01 13:05:45

标签: c arrays struct char strstr

我有一个结构定义为;

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); 
}

5 个答案:

答案 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++;
}