格式';%s';应为类型为'*char';但参数2的类型为';int';
当我试图编译我的程序时,我在标题中得到警告消息,当我扫描完名字和分数后运行它时,它就停止了。我在练习使用字符串时遇到过很多次这个问题,但我一直没有找到解决方案格式';%s';应为类型为'*char';但参数2的类型为';int';,c,arrays,string,structure,C,Arrays,String,Structure,当我试图编译我的程序时,我在标题中得到警告消息,当我扫描完名字和分数后运行它时,它就停止了。我在练习使用字符串时遇到过很多次这个问题,但我一直没有找到解决方案 #include <stdio.h> struct students { char name[20]; int score[20]; } student; int main() { int i, n; printf("Number of students:\n"); scanf("%d", &
#include <stdio.h>
struct students {
char name[20];
int score[20];
} student;
int main() {
int i, n;
printf("Number of students:\n");
scanf("%d", &n);
for(i=0; i<n; i++) {
printf("Name of the student:\n");
scanf("%s", &student.name[i]);
printf("Score of the student:\n");
scanf("%d", &student.score[i]);
}
for(i=0;i<n;i++) {
if(student.score[i] >= 15) {
printf("%s passed the exam\n", student.name[i]); }
else {
printf("%s failed the exam\n", student.name[i]);
}
}
return 0;
}
#包括
结构学生{
字符名[20];
整数分[20];
}学生;
int main(){
inti,n;
printf(“学生人数:\n”);
scanf(“%d”和“&n”);
对于(i=0;i有几个问题:
printf("%s passed the exam\n", student.name[i]);
student.name[i]
是char
但%s
格式说明符需要指向char
的指针
但实际的问题是,你对学生的声明并不是你所需要的。下面的结构声明了一个学生,他的名字可以长达19个字符,并且有20个分数
struct students {
char name[20];
int score[20];
} student;
但你需要20名(或更多?)学生,每个人都有一个分数:
struct student {
char name[50]; // name up to 49 characters
int score; // score
} student;
struct student students[20]; // array of 20 students
我将代码的实现留给读者作为练习。
您需要熟悉以下概念:
- 阵列
- 结构
- 弦
scanf
和printf
所有这些主题都包含在您的C教科书中。有几个问题:
printf("%s passed the exam\n", student.name[i]);
student.name[i]
是char
但%s
格式说明符需要指向char
的指针
但实际的问题是,你对学生的声明并不是你所需要的。下面的结构声明了一个学生,他的名字可以长达19个字符,并且有20个分数
struct students {
char name[20];
int score[20];
} student;
但你需要20名(或更多?)学生,每个人都有一个分数:
struct student {
char name[50]; // name up to 49 characters
int score; // score
} student;
struct student students[20]; // array of 20 students
我将代码的实现留给读者作为练习。
您需要熟悉以下概念:
- 阵列
- 结构
- 弦
scanf
和printf
所有这些主题都包含在您的C教科书中。您的代码有很多问题。
1) 学生应该是数组(或动态分配内存)。
2) 字符串扫描需要按如下方式进行
scanf(“%s”,学生[i].姓名)
或
scanf(“%s”,&student[i].name[0])
3) 如果字符串长度超过20字节(包括nul字符),您仍然会遇到问题。您的代码有很多问题。
1) 学生应该是数组(或动态分配内存)。
2) 字符串扫描需要按如下方式进行
scanf(“%s”,学生[i].姓名)
或
scanf(“%s”,&student[i].name[0])
3) 但若字符串长度超过20字节(包括nul字符),您仍然会遇到问题
为单个20个字符的字符串留出空间,因此students.name[i]
引用单个字符(在scanf
调用中提升为typeint
)
要定义字符串数组,需要一个字符的2D数组,如
char name[NUMBER_OF_STRINGS][MAX_STRING_LENGTH+1];
你把它读作
scanf( “%s”, student.name[i] ); // no & operator here
在大多数情况下,数组表达式“衰减”为指针表达式,因此这里不需要&
运算符
或者,您可以声明指向char
的指针数组,如
char *name[NUMBER_OF_STRINGS];
然后在读取每个字符串时为其分配内存:
char buffer[MAX_STRING_LENGTH+1];
...
scanf( “%s”, buffer );
student.name[i] = malloc( strlen( buffer ) + 1 );
if ( student.name[i] )
strcpy( student.name[i], buffer );
你只需要记住当你完成的时候给每个student.name[i]
免费
为单个20个字符的字符串留出空间,因此students.name[i]
引用单个字符(在scanf
调用中提升为typeint
)
要定义字符串数组,需要一个字符的2D数组,如
char name[NUMBER_OF_STRINGS][MAX_STRING_LENGTH+1];
你把它读作
scanf( “%s”, student.name[i] ); // no & operator here
在大多数情况下,数组表达式“衰减”为指针表达式,因此这里不需要&
运算符
或者,您可以声明指向char
的指针数组,如
char *name[NUMBER_OF_STRINGS];
然后在读取每个字符串时为其分配内存:
char buffer[MAX_STRING_LENGTH+1];
...
scanf( “%s”, buffer );
student.name[i] = malloc( strlen( buffer ) + 1 );
if ( student.name[i] )
strcpy( student.name[i], buffer );
您只需要记住在完成后释放每个学生.name[i]
。学生名是字符的单数数组,需要是字符数组的数组
struct students {
char name[20][40];
int score[20];
} student;
我武断地认为每个名字40个字符就足够了
名称的scanf需要更改为:
scanf("%s", &student.name[i]);
致:
学生姓名是字符的单数数组,必须是字符数组的数组
struct students {
char name[20][40];
int score[20];
} student;
我武断地认为每个名字40个字符就足够了
名称的scanf需要更改为:
scanf("%s", &student.name[i]);
致:
scanf(“%s”和&student.name[i]);
您正在对声明的字符串中的单个char
进行寻址。我假设您希望每个学生都有一个单独的对象。为此,我的建议是如下定义您的struct
:
typedef struct students {
char name[20];
int score;
}Student;
通过这个,您定义了一个名为Student
的新数据类型。类型为Student
的每个对象都有一个名为name
的字符串和一个类似于分数的int
创建此模型后,可以将其视为另一种变量类型,例如,以下内容完全有效:
Student student1, student2;
或者,您可以创建一个Student
s:Student group[20]
数组,然后让一个循环用数据填充它:
for(int i = 0; i < n; i++){
puts("Name of the student: ");
fgets(group[i].name, 20, stdin);
puts("Score of the student: ");
scanf("%d", &group[i].score);
}
for(int i=0;i
该交易是每次迭代引用学生数组中的单个对象。
此外,我强烈建议使用<代码> FGETSH()/代码>或至少<代码> GETSX()/<代码>输入字符串。<代码> SCANFF()/Cult>存在多个问题,其中一些问题是,如果遇到空格、制表符或换行符,则停止输入,最重要的是它不检查数组的边界。