массив символов strstr внутри массива структур

У меня есть структура, определенная как;

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

person sudomakemeasandwich    schedule 01.04.2014    source источник
comment
Какие значения inputFromUser и {players[x].name} вы тестировали?   -  person Tim    schedule 01.04.2014
comment
Почему фигурные скобки вокруг players[x].name?   -  person mic_e    schedule 01.04.2014
comment
Предполагая, что вы пытаетесь найти имя игрока, используя ввод от пользователя, у вас есть аргументы strstr в обратном порядке, также обратите внимание, что strstr чувствителен к регистру.   -  person imbtfab    schedule 01.04.2014
comment
@imbtfab: я думаю, вы можете написать это как ответ, даже если вопрос слишком неточен, чтобы его проверить.   -  person mic_e    schedule 01.04.2014
comment
насколько я знаю, strstr добавляет 2-ю строку к первой, значения не возвращает   -  person Alex Barac    schedule 01.04.2014
comment
@AlexBarac - нет. Это будет strcat.   -  person noelicus    schedule 01.04.2014
comment
Функция @AlexBarac strstr возвращает указатель на первое вхождение строки любой из всей последовательности символов, указанной в targetstring, или нулевой указатель, если последовательность отсутствует в строке, которую вы ищете.   -  person Jayesh Bhoi    schedule 01.04.2014
comment
Вы получили inputFromUser с помощью fgets()?   -  person joop    schedule 01.04.2014
comment
нет, я беру ввод с помощью fgetc, а затем назначаю его массиву символов, когда пользователь вводит. Я заполняю массив структур с помощью getline fyi.   -  person sudomakemeasandwich    schedule 01.04.2014
comment
@noelicus ты прав, моя ошибка   -  person Alex Barac    schedule 01.04.2014
comment
Что происходит, когда вы делаете char *p = strstr(players[x].name, "someName");? Он также показывает ту же проблему? В противном случае вы можете напечатать inputFromUser напрямую, например: printf("[%s],[%s]", players[x].name, inputFromUser); в следующей строке, чтобы увидеть, есть ли пробелы и т. д., которые не сразу видны...   -  person ssm    schedule 01.04.2014
comment
@ssm Я тоже пробовал все комбинации :) char *p = strstr(players[x].name, someName); найдено, но не найдено, когда его char *p = strstr(inputFromUser, player[x].name);   -  person sudomakemeasandwich    schedule 01.04.2014


Ответы (5)


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++;
} 
person Rikayan Bandyopadhyay    schedule 01.04.2014

Добавлено как ответ, предложенный mic_e

Предполагая, что вы пытаетесь найти имя игрока, используя ввод от пользователя, у вас есть аргументы strstr в обратном порядке. Также обратите внимание, что строка strstr чувствительна к регистру.

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

person imbtfab    schedule 01.04.2014
comment
Если p равно null, проверьте входные данные и имена игроков. Случай такой же? Например. Вы != вы и вернете null. Содержит ли inputFromUser конечный пробел или CR/LF и т. д.? - person imbtfab; 01.04.2014
comment
Нет, inputFromUser не имеет пробелов или других пробелов и заканчивается на LF. - person sudomakemeasandwich; 01.04.2014
comment
И inputFromUser, и имя игрока правильно завершаются нулем? strstr как указано, является правильным использованием, если оно не совпадает, то это либо строка, которую вы ищете, либо пользовательский ввод, который не является тем, что вы думаете. Используйте отладчик, выполните один шаг через цикл for и посмотрите как на player[x].name, так и на inputFromUser, где, по вашему мнению, они должны совпадать, а затем проверьте символ за символом. - person imbtfab; 01.04.2014

Так:

char *p = strstr(players[x].name, inputFromUser);
person noelicus    schedule 01.04.2014
comment
Это противоположно вашему вопросу - аргументы были неправильными. - person noelicus; 01.04.2014

Это должно работать, это не сработает, если ваш ввод неверен, позвольте мне объяснить по-простому

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

Надеюсь, это рассеет ваши сомнения.

person Jayesh Bhoi    schedule 01.04.2014
comment
Я знаю, что это чувствительно к регистру, проблема не в чувствительности к регистру. - person sudomakemeasandwich; 01.04.2014
comment
@user2237922 user2237922 Я просто привел пример. Очень хорошо, если вы знаете об этом. Но я предполагаю, что способ, которым вы вводите информацию, может быть неправильным. Итак, вы можете опубликовать код того, как вы принимаете ввод? - person Jayesh Bhoi; 01.04.2014

Это должно работать.

Я думаю, что у вас проблема с чтением файла, который заполняет массив данных.

Пожалуйста, убедитесь, что данные, которые вы заполнили в структуре, в порядке.

И strstr возвращает адрес первого появления строки1 в строке2, где strstr(string2, string1);

person Muthe    schedule 01.04.2014