簡體   English   中英

結構數組內部的strstr char數組

[英]strstr char array inside struct array

我有一個結構定義為;

struct player {

    int no, age;

    char name[20];  

} players[10];

數組從文件填充。 我想做的是,從用戶那里獲取輸入,將輸入添加到char數組,將其發送到search(char lookup [])函數,並在循環中返回strstr name字段。

EDİT:對不起,我更正了訂單。 我正在嘗試循環播放。

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

但是p始終為null。 我怎樣才能做到這一點?

提前致謝。

編輯-已添加代碼...

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

根據mic_e的建議添加為答案

假設您嘗試使用來自用戶的輸入來搜索玩家名稱,那么您擁有相反順序的strstr參數。 另請注意,strstr區分大小寫。

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

像這樣:

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

它應該可以工作,如果您輸入的內容有誤,那就失敗了,讓我簡單地解釋一下

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

那意味着

此函數返回一個指針,該指針指向mystr指定的整個字符序列中str中第一次出現的指針;如果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);

希望這能清除您的疑慮。

那應該工作。

我認為您在填充數據數組的文件讀取時遇到問題。

請確保您輸入的數據正確。

並且strstr返回string2中string1的第一次出現的地址,其中strstr(string2,string1);

fgets存儲\\n ,然后停止接受輸入。

因此,假設玩家名稱為"user"players[i].name將等於"user\\n"a"user"

因此, strstr返回始終為NULL

嘗試以下方法:

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

或者,通過fgets從文件中輸入后,刪除\\n

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM