结构体数组内的strstr char数组(strstr char array inside stru

2019-10-19 17:32发布

我有一个结构定义为:

struct player {

    int no, age;

    char name[20];  

} players[10];

数组是从文件填充。 我尝试做的是,以来自用户的输入,增加输入字符数组,将其发送至搜索(字符查找[])功能和strstr名称字段在一个循环。

编辑:对不起,我纠正了订单。 我想在一个循环中的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); 
}

Answer 1:

fgets存储\n ,然后停止服用输入。

因此,假设一个球员的名字是"user"players[i].name将等于"user\n" ,而a"user"

所以返回strstr始终是NULL

试试这个:

p = strstr(players[i].name,a);

OR,删除\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++;
} 


Answer 2:

添加答案由mic_e的建议

假设你想搜索使用从用户输入一个球员的名字,你的的strstr参数以相反的顺序。 另外请注意,是的strstr区分大小写。

字符* P =的strstr(玩家[X] .name和inputFromUser);



Answer 3:

像这样:

char *p = strstr(players[x].name, inputFromUser);


Answer 4:

它应该工作,这是失败,如果你输入错误,让我简单expalain

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

我希望这清楚你的疑惑。



Answer 5:

应工作。

我觉得你有与填充数据阵列文件读取的问题。

请确保您充入的结构,数据是好的。

和返回的strstr包含字符串,其中,的strstr(字符串2,字符串1)的字符串1中第一次出现的地址;



文章来源: strstr char array inside struct array