【问题标题】:My code works in a C++ compiler but doesn't work on C [duplicate]我的代码在 C++ 编译器中工作,但在 C 上不起作用 [重复]
【发布时间】:2022-07-07 19:33:24
【问题描述】:

下面编写的代码似乎不适用于 C 编译器,我不知道为什么,但是如果在 C++ 编译器上完成,在 C 编译器上完成时似乎只有一堆破折号的输出,但可以工作通常在 C++ 编译器上。基本上代码是什么,它要求一定数量的学生,它会找到代码开头提到的数字的平均成绩百分比。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#include <unistd.h>
int main(int argc, char *argv[]){
int numStudents;
int currentStudent=0;
int student[numStudents],Rec[numStudents],quiz[numStudents],exam[numStudents],eval[numStudents];
int final;
char remarks[numStudents][15];
char letter[numStudents][15];

printf("Enter amount of students: ");
scanf("%d",&numStudents);
currentStudent=0;

do {
printf("Enter Student Number:");
scanf("%d",&student[currentStudent]);
printf("Enter Recitation:");
scanf("%d",&Rec[currentStudent]);
printf("Enter Quizzes:");
scanf("%d",&quiz[currentStudent]);
printf("Enter Final Exam:");
scanf("%d",&exam[currentStudent]);
printf("Enter Evaluation:");
scanf("%d",&eval[currentStudent]);
currentStudent++;
} while(currentStudent!=numStudents);
currentStudent=0;

do {
final=(Rec[currentStudent]*.2)+(quiz[currentStudent]*.35)+(exam[currentStudent]*.4)+(eval[currentStudent]*.05);
if(final<=100&&final>=96){

strcpy(remarks[currentStudent],"Passed");
strcpy(letter[currentStudent],"A+");
}
if(final<=95&&final>=92){

strcpy(remarks[currentStudent],"Passed");
strcpy(letter[currentStudent],"A-");
}
if(final<=88&&final>=91){

strcpy(remarks[currentStudent],"Passed");
strcpy(letter[currentStudent],"B+");
}
if(final<=83&&final>=87){

strcpy(remarks[currentStudent],"Passed");
strcpy(letter[currentStudent],"B-");
}
if(final<=78&&final>=82){

strcpy(remarks[currentStudent],"Passed");
strcpy(letter[currentStudent],"C+");
}
if(final<=74&&final>=77){

strcpy(remarks[currentStudent],"Passed");
strcpy(letter[currentStudent],"C-");
}
if(final<=70&&final>=73){

strcpy(remarks[currentStudent],"Passed");
strcpy(letter[currentStudent],"D");
}
if(final<70){   

strcpy(remarks[currentStudent],"Failed");
strcpy(letter[currentStudent],"F");
}
printf("\nNumber    Recitation  Quizzes Final Exam  Evaluation  Final Grade Remarks Letter");
printf("\n%d %d %d %d %d %d %s %s",student[currentStudent],Rec[currentStudent],quiz[currentStudent],exam[currentStudent],eval[currentStudent],final,remarks[currentStudent],letter[currentStudent]);
currentStudent++;
final=0;
} while(numStudents!=currentStudent);

}

【问题讨论】:

  • 你不能像这样声明可变大小的数组。
  • int numStudents; — 你声明了一个变量,但没有初始化它,所以它会有一些任意值。 int student[numStudents] — 现在你声明了一个数组,但是有多少个元素?由于此时未初始化 numStudents,因此访问它会导致未定义的行为。
  • ... 尤其是在大小根本没有初始化的情况下。此代码在 C 和 C++ 中都被破坏(由于扩展而编译)。如果您正在学习,请养成让编译器帮助您的习惯,对于 GCC 或 Clang,请指定 -pedantic -Wall -Wextra,然后阅读诊断信息并采取行动。
  • 另请注意,即使您将正确初始化 numStudents,在 C++ 中它也需要是编译时常量,因为 C++ 标准不支持可变长度数组 (VLA)。
  • 从技术上讲,代码在 C 中具有未定义的行为(使用 VLA,大小由未初始化的变量给出)并且不是有效的 C++(由于使用 VLA,这是一个可诊断的错误在标准 C++ 中)。您碰巧使用了支持 VLA 作为 非标准 扩展的 C++ 编译器,在这种情况下,行为也未定义。当行为未定义时,任何结果(写一些明智的东西,让您的计算机崩溃)都是同样正确的结果 - 不需要诊断。

标签: c++ c


【解决方案1】:

这些声明

int numStudents;
int currentStudent=0;
int student[numStudents],Rec[numStudents],quiz[numStudents],exam[numStudents],eval[numStudents];
int final;
char remarks[numStudents][15];
char letter[numStudents][15];

声明可变长度数组。

可变长度数组不是标准 C++ 功能。

但在任何情况下,即使在 C 中,由于在数组的声明中使用了未初始化的变量 numStudents,因此程序具有未定义的行为。

你必须在这些代码sn-p之后声明数组

printf("Enter amount of students: ");
scanf("%d",&numStudents);

当变量numStudents 将获得正值时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-08
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    相关资源
    最近更新 更多