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

Error in strcmp() when I use a structure as a parameter

我的程序需要这些功能:

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

  1. 只要用户仍然愿意,该程序就应该持续允许用户输入。 (动态)
  2. 获取学生的最终成绩(frst_grade、scnd_grade、fnl_grade的平均分)
  3. 获取每所大学的学生人数。
  4. 通过输入s_id获取学生姓名。

我的问题是如何将搜索输入与 s_college 中的用户输入进行比较以获得学生人数。我知道的唯一方法是使用 strcmp() 但它给了我这个错误:从 'char' 到 'const 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);

您不能将 strcmp 用于非空终止字符串。你可以写

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

不要忘记删除垃圾分号以使 if 语句起作用。

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

也许声明search2如下:

char search2[50];

另请阅读有关 scanf 以防止缓冲区溢出的内容:

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

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

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

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

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

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

search2 应该是字符串吗?然后将其声明为array,如

char ..., search2[100];

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

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

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

编译器告诉你错误:变量 search2 是字符而 s_college[5]; 是字符数组。函数 strcmp 需要两个 arrays/pointers 才能工作。

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

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

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

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

所以函数要正确地传递 char* 或 char 数组(这又是一个 char*)。

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

像这样定义你的结构;

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.h 中找到。 exit()EXIT_FAILUREstdlib.h 中找到。

注意:在C中,当引用一个数组时,结果是指向该数组第一个字节的指针,所以在调用scanf()时一定不能在引用数组时使用& s_college[].

`