【问题标题】:strstr char array inside struct array结构数组内的strstr char数组
【发布时间】:2014-05-12 06:44:27
【问题描述】:

我有一个结构定义为;

struct player {

    int no, age;

    char name[20];  

} players[10];

数组是从文件中填充的。我尝试做的是,从用户那里获取输入,将输入添加到 char 数组,将其发送到 search(char lookup[]) 函数和循环中的strstr name 字段。

编辑:抱歉,我更正了订单。我正在尝试 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); 
}

【问题讨论】:

  • 你测试的inputFromUser{players[x].name}的值是多少?
  • 为什么players[x].name 周围有大括号?
  • 假设您尝试使用用户的输入搜索玩家姓名,您的 strstr 参数的顺序相反,还要注意 strstr 区分大小写。
  • @imbtfab:我认为您可以将其写为答案——即使问题太不精确而无法实际验证。
  • 据我所知,strstr 将第二个字符串附加到第一个字符串,它不返回值

标签: c arrays struct char strstr


【解决方案1】:

按照 mic_e 的建议添加为答案

假设您尝试使用来自用户的输入来搜索玩家姓名,那么您的 strstr 参数的顺序是相反的。另请注意,strstr 区分大小写。

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

【讨论】:

  • 如果 p 为空,则检查输入和玩家姓名。情况是一样的吗?例如。你!=你,并且将返回null。 inputFromUser 是否包含尾随空格或 CR/LF 等?
  • 否,inputFromUser 没有空格或其他,并以 LF 结尾。
  • inputFromUser 和玩家名称都正确地以 null 结尾?给定的 strstr 是正确使用,如果它不匹配,那么它要么是您正在搜索的字符串,要么是用户输入,这不是您认为的那样。使用调试器,单步执行 for 循环,查看 player[x].name 和 inputFromUser 您认为应该匹配的位置,然后逐个字符检查。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    像这样:

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

    【讨论】:

    • 这与你的问题相反——论点是错误的。
    【解决方案4】:

    它应该可以工作,如果你的输入错误就失败让我简单解释一下

    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 中指定的任何整个字符序列中的任何一个在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);
    

    我希望这能消除您的疑虑。

    【讨论】:

    • 我知道它区分大小写,问题是不区分大小写。
    • @user2237922 我只是举个例子。如果您了解它,那就太好了。但我的假设是您获取输入的方式可能是错误的。那么你能发布你如何接受输入的代码吗?
    【解决方案5】:

    应该可以。

    我认为您在读取填充数据数组的文件时遇到了问题。

    请确保您填写到结构中的数据没有问题。

    而strstr返回string2中string1第一次出现的地址 在哪里, strstr(string2, string1);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      相关资源
      最近更新 更多