2014-04-01 57 views
1

我有一個結構定義爲;strstr字符數組結構數組裏面

struct player { 

    int no, age; 

    char name[20]; 

} players[10]; 

數組從文件中填充。我嘗試做的是,從用戶處獲得輸入,將輸入添加到char數組,將其發送到循環中的搜索(char lookup [])函數和名稱字段。

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

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

什麼是inputFromUser'的'和'{玩家[X]的值。名稱}'你測試了嗎? –

+0

爲什麼圍繞'players [x] .name'的大括號? –

+1

假設您試圖使用用戶的輸入搜索玩家名稱,則您將以相反的順序輸入strstr的參數,還要注意strstr區分大小寫。 – imbtfab

回答

0

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

添加答案由mic_e

的建議假設你想搜索使用從用戶輸入一個球員的名字,你有strstr的參數以相反的順序排列。另請注意,strstr區分大小寫。

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

+0

編輯該問題。 – sudomakemeasandwich

+0

如果p爲null,則檢查輸入和玩家名稱。情況是否一樣?例如。你!=你,並且會返回null。 inputFromUser是否包含尾部空格或CR/LF等? – imbtfab

+0

不,inputFromUser沒有空格或其他字符,並以LF結尾。 – sudomakemeasandwich

0

像這樣:

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

這就是我嘗試和失敗。 – sudomakemeasandwich

+0

這與你的問題相反 - 參數是錯誤的。 – noelicus

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

輸出expalain是

The substring is: stack over flow string 

這意味着

This函數返回一個指向中指定的任何整個字符序列的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); 

我希望這可以清楚你的疑惑。

+0

我知道它對大小寫敏感,問題不區分大小寫。 – sudomakemeasandwich

+0

@ user2237922我只是舉個例子。如果你瞭解它,這是非常好的。但是我的假設是你從中獲得輸入的方式可能是錯誤的。那麼你可以在代碼中輸入你如何接受輸入嗎? –

+0

我添加了代碼 – sudomakemeasandwich

0

這應該工作。

我覺得你有文件讀取的問題哪個填充數據數組。

請確保填入結構的數據正確。

和strstr返回字符串1中string1的第一個出現地址 其中, strstr(string2,string1);

+0

我添加了填充數組的代碼 – sudomakemeasandwich