格式';%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
调用中提升为type
int

要定义字符串数组,需要一个字符的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
调用中提升为type
int

要定义字符串数组,需要一个字符的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>存在多个问题,其中一些问题是,如果遇到空格、制表符或换行符,则停止输入,最重要的是它不检查数组的边界。