当我使用结构作为参数时,strcmp()出错

时间:2016-05-15 09:06:43

标签: c string structure strcmp

我的程序需要这些功能:

注意:我没有包含数字1,2和amp;的代码。 4因为我已经完成了它们。第三个是我的问题。

  1. 只要用户仍然想要,程序就应该持续允许用户输入。 (动态地)
  2. 获得学生的最终成绩(平均为frst_grade,scnd_grade,fnl_grade)
  3. 获得每所大学的学生人数。
  4. 输入s_id获取学生姓名。
  5. 我的问题是如何将搜索输入与s_college中的用户输入进行比较以获得学生数量。我知道的唯一方法是使用strcmp(),但它给了我这个错误:来自' char'的无效转换。到#char; char *' [-fpermissive]

    那么如何比较这两者以获得每所大学的学生人数?

    #include<stdio.h>    
    #include<string.h>    
    #include<conio.h>    
    
    int i,n,sum,search,num=0,ctr=0;
    
    char answer,choice,choice2,search2;
    
    struct record{
    
    int s_id;
    char s_name[100];
    char s_course;
    char s_college[5];
    int s_scoress;
    }id[100],name[100],course,college[100],scores;
    
    struct s_scores{
    int frst_grade;
    int scnd_grade;
    int fnl_grade;
    }first,second,final;
    
    
    
    void ADD();
    void COLLEGE();
    void ID();
    
    
    void COLLEGE(){
    printf("Enter college (abbreviation only)");
    scanf("%s",&search2);
    for(i=0;i<num;i++){
    if(strcmp(college[i].s_college,search2)==0);
    ctr++;    
    }  
    printf("The number of students in %s is %d",search2,ctr);
    

6 个答案:

答案 0 :(得分:7)

让我们来看看这些(部分)行:

char ..., search2;
...
scanf("%s",&search2);
...
...strcmp(college[i].s_college,search2)...

变量search2单个字符。尝试将字符串放入其中将至少写入两个字符:您读取的字符串加上字符串终结符。这意味着你将写出界限。

然后使用字符变量作为strcmp的参数,它将search2的内容转换为指针,并将该指针用作指向字符串的指针。

这两个问题都会导致未定义的行为

search2应该是一个字符串吗?然后将其声明为数组,如

char ..., search2[100];

如果search2应该是单个字符,那么首先需要读取一个字符

scanf("%c", &search2);  // Note the changed format to read a single character

然后您需要将比较更改为不使用strcmp

答案 1 :(得分:5)

您不能将strcmp与不是以null结尾的字符串一起使用。你可以写

if(college[i].s_college[0] == search2 && college[i].s_college[1] == '\0')

不要忘记删除垃圾分号以使if语句有效。

答案 2 :(得分:5)

你的search2只是一个角色。你需要一个字符串

或许声明search2如下:

char search2[50];

另请阅读scanf以防止缓冲区溢出:

scanf("%49s", search2); // Do not go past the end of search2[50]

答案 3 :(得分:1)

编译器告诉你错误:变量search2是char,而s_college[5];是chars数组。函数strcmp需要两个数组/指针才能工作。

如果search2只有一个字节,那么你可以创建:char Search2[2];,它将保存一个char和终端为null。但是只有当search2是一个字节时,这才有效。但是,如果您必须比较search2多于一个字节的两个字符数组,那么您应该考虑动态分配或创建静态数组char search2[some_length];

答案 4 :(得分:1)

这不是一个完整的'答案',但它确实修复了代码中的一些主要问题:

像这样定义你的结构;

struct s_scores
{
    int frst_grade;
    int scnd_grade;
    int fnl_grade;
};


struct record
{
    int  s_id;
    char s_name[100];
    char s_course;
    char s_college[5];
    struct s_scores  s_scoress;
};

struct record records[100];

然后访问类似于:

的各个字段
if( 1 != scanf( "%4s", records[i].s_college ) )
{
    perror( "scanf for college abbreviation failed" );
    exit( EXIT_FAILURE )
}

// implied else, scanf successful

// validate the college abbreviation

for( size_t j=0; j< (sizeof(collegesAbbrevationsTable)/(sizeof( *collegeAbbreviationsTable ); i++ )
{
    if( strncmp( collegeAbbreviationsTable[j], records[i].s_college, 4)
    { // then found matching abbreviation
        break; // exit 'validation' loop
    }
}

注意:perror()中找到stdio.hexit()中找到EXIT_FAILUREstdlib.h

注意:在C中,当引用数组时,结果是指向该数组的第一个字节的指针,因此在引用数组时scanf()的调用不得使用& {{ 1}}。

`

答案 5 :(得分:-2)

将search2声明为char search2 [10];或char * search2;

原因:string2是一个字符变量,college是一个空终止字符数组。

stncmp id int strcmp的签名(const char * s1,const char * s2);

因此正确的函数需要传递char *或char数组(这也是char *)。