我的程序需要这些功能:
注意:我没有包含数字1,2和amp;的代码。 4因为我已经完成了它们。第三个是我的问题。
我的问题是如何将搜索输入与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);
答案 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.h
。 exit()
中找到EXIT_FAILURE
和stdlib.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 *)。