当我使用结构作为参数时 strcmp() 出错
Error in strcmp() when I use a structure as a parameter
我的程序需要这些功能:
注意:我没有包含数字 1,2 和 4 的代码,因为我已经完成了它们。第三个是我的问题
- 只要用户仍然愿意,该程序就应该持续允许用户输入。 (动态)
- 获取学生的最终成绩(frst_grade、scnd_grade、fnl_grade的平均分)
- 获取每所大学的学生人数。
- 通过输入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_FAILURE
在 stdlib.h
中找到。
注意:在C中,当引用一个数组时,结果是指向该数组第一个字节的指针,所以在调用scanf()
时一定不能在引用数组时使用&
s_college[]
.
`
我的程序需要这些功能:
注意:我没有包含数字 1,2 和 4 的代码,因为我已经完成了它们。第三个是我的问题
- 只要用户仍然愿意,该程序就应该持续允许用户输入。 (动态)
- 获取学生的最终成绩(frst_grade、scnd_grade、fnl_grade的平均分)
- 获取每所大学的学生人数。
- 通过输入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_FAILURE
在 stdlib.h
中找到。
注意:在C中,当引用一个数组时,结果是指向该数组第一个字节的指针,所以在调用scanf()
时一定不能在引用数组时使用&
s_college[]
.
`