【问题标题】:How do I get a full input stream for my program?如何获得程序的完整输入流?
【发布时间】:2020-01-05 14:38:42
【问题描述】:

我有一个任务,我需要输入学生的所有信息(ID,姓名,年级)作为数据库作为下面的源代码。我这里的源代码对语法完全有效(没有像我的 gcc 那样通知错误),但我无法输入学生的成绩。当我运行我的程序时,它跳过了输入学生成绩的步骤和输入下一个学生ID的步骤。我已将 getchar() 用于保存 \n 字符,但它可能根本不起作用,或者还有其他原因导致此错误。

typedef struct 
{
    char id[10];
    char name[50];
    float grade;
    char assess;
}student;
student std[50];
    do {
        printf("How many students you want to add?\n");
        scanf("%d", &num);
        if(num<0 || num>50)
            printf("Your number must be positive or smaller than or equal to 50!\n");
    } while(num<0||num>50);

    for(i = a; i < num; i++)
    {
        printf("Student's id No.%d:", i);
        fgets(std[i].id, MAX, stdin);
        getchar();
        printf("Student's name No.%d:", i);
        fgets(std[i].name, MAX, stdin);
        getchar();
        printf("Student's grade No.%d:", i);
        do {
            scanf("%f", std[i].grade);
            if(std[i].grade < 0 || std[i].grade > 10)
                printf("Please re-input grade, it must be between 0 and 10\n");
        } while(std[i].grade < 0 || std[i].grade > 10);
        std[i].assess=assess(std[i].grade);
    }

【问题讨论】:

  • fgets 还读取行尾字符,并将其放入您的字符串中。
  • 很高兴知道std 的确切定义。
  • 同样显示的已经不完整的代码,本身看起来不完整:第二个 while 看起来是孤立的。干净清晰的缩进会有所帮助。
  • @alk 因为这只是我程序的一小部分,而且我的完整版很长,我认为没有必要,所以我不把它们都放在这里
  • 您显示的 for 循环内缺少 do。即使作为一个片段也没有意义。

标签: c loops input


【解决方案1】:

要将数据写入为变量分配的内存位置,您需要指定变量的地址,您使用的是scanf。所以scanf("%f", std[i].grade);应该修改为scanf("%f", &amp;(std[i].grade) );

由于上述原因,您的代码具有未定义的行为,这通常但并非总是会导致分段错误。

【讨论】:

  • 哦,我明白了。但我不知道为什么我的 gcc 在这种情况下没有显示任何警告或错误
  • @HoangNam:至少在调用 GCC 编译并认真对待发出的警告时,养成传递-Wall -Wextra -pedantic 的习惯。
  • 我已根据您的回答检查并更改了我的源代码,但我仍然收到该错误。我认为肯定有其他问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
相关资源
最近更新 更多