#include <stdio.h>
#include <conio.h>

#define STUD 3

struct students {
  char name[30];
  int score;
  int presentNr;
} student[STUD];

void main() {
  for (int i = 1; i <= STUD; i++) {
    printf("Name of the student %d:\n", i);
    scanf("%[^\n]s", student[i].name);

    printf("His score at class: ");
    scanf("%d", &student[i].score);

    printf("Number of presents at class: ");
    scanf("%d", &student[i].presentNr);
  }
  getch();
}


嗨,大家好!
我想在结构中存储学生的姓名和他在课堂上的分数。
在第一个循环中,我可以在变量“ name”中存储多个单词,但是在第二个循环中,它会跳过。

最佳答案

第一:您需要从零(i = 0)开始循环,因为C数组从零开始。

也就是说,我想您的问题是因为最后一个scanf()stdin缓冲区中留下了换行符。您可以尝试以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STUD 3

struct students {
  char name[30];
  int score;
  int presentNr;
} student[STUD];

void clean_stdin(void)
{
  char c;
  do c = getchar(); while (c != '\n' && c != EOF);
}

int main() {
  for (int i = 0; i < STUD; i++) {

    printf("Name of the student %d:\n", i + 1);
    fgets((char*)&student[i].name, 30, stdin);

    // Remove the line break at the end of the name
    student[i].name[strlen((char*)&student[i].name) - 1] = '\0';

    printf("His score at class: ");
    scanf("%d", &student[i].score);

    printf("Number of presents at class: ");
    scanf("%d", &student[i].presentNr);

    // cleans stdin buffer
    clean_stdin();
  }

  getchar();
}


注意:有一个内置函数(fflush())刷新输入缓冲区,但有时由于某种原因它不起作用,因此我们使用自定义的clean_stdin()函数。

关于c - 字符串C中的多个单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40579208/

10-11 21:58