c++,指令无法执行,无法录入并输出大学名称,刚入门,求学长看看问题在哪

代码如下所示


#include <stdio.h>
#include <cstring>

int main()
{
    double score[10] = { 0 };
    char name[10][11] = { {0} };
    int i = 0, j = 0, h = 0;

    while (1) 
    {
        printf("\n欢迎使用大学评价系统,请根据提示输入相应的信息\n");
        printf("\n1.开启评价系统 2.对已输入的评分进行排名(从小到大)\n");
        scanf_s("%d", &h);
        if (h == 1) 
        {
            printf("\n请输入该大学的名称(最多10个字符):");
            int len = 0;
            while (1) 
            {
                char c = getchar();
                if (c == '\n')
                {  
                    break;   // 输入结束
                }
                if (c < ' ' || c > '~') 
                {  
                    while (getchar() != '\n');
                    continue;   // 非法字符,清空输入缓冲区
                }
                if (len < 10) 
                {
                    name[i][len++] = c;
                }
            }
            name[i][len] = '\0';   // 填充空格
            printf("\n请输入该大学的校友会排名:");
            int a;
            scanf_s("%d", &a);
            double s1 = (a <= 300) ? 0.5 : 0.25;

            printf("\n请输入该大学的软科排名:");
            int b;
            scanf_s("%d", &b);
            double s2 = (b <= 300) ? 0.5 : 0.25;

            printf("\n请输入该大学的US世界排名,如无请输0:");
            int c;
            scanf_s("%d", &c);
            double s3 = (c == 0) ? 0.0 : (c >= 0 && c <= 1600) ? 1.0 : 0.5;

            printf("\n请输入该大学是否坐落于省会城市:");
            printf("\n1.是 2.否");
            int d;
            scanf_s("%d", &d);
            double s4 = (d == 1) ? 2.0 : 1.0;

            printf("\n请输入该大学的考研率,以小数形式输入:");
            float e;
            scanf_s("%f", &e);
            double s5 = (e <= 0.1) ? 0.5 : 1.0;

            printf("\n请输入该大学是一本还是二本:");
            printf("\n1.一本 2.二本");
            int f;
            scanf_s("%d", &f);
            double s6 = (f == 1) ? 5.0 : 3.0;

            double s7 = s1 + s2 + s3 + s4 + s5 + s6;
            printf("\n该大学的综合评分是%f", s7);

            score[i] = s7;
            i++;

            printf("\n1.回到主菜单 2.继续录入新大学的数据");
            scanf_s("%d", &h);
            if (h == 1) 
            {
                continue;
            }
        }
        else if (h == 2) 
        {
            for (i = 0; i < 9; i++) 
            {
                for (j = 9; j > i; j--) 
                {
                    if (score[i] > score[j]) 
                    {
                        double tmp = score[i];
                        score[i] = score[j];
                        score[j] = tmp;
                        char name_tmp[11];
                        strcpy_s(name_tmp, 11, name[i]);
                        strcpy_s(name[i], 11, name[j]);
                        strcpy_s(name[j], 11, name_tmp);
                    }
                }
            }
            printf("\n排名结果(从小到大):\n");
            for (i = 0; i < 10; i++) 
            {
                printf("%s    %f\n", name[i], score[i]);
            }
            printf("\n1.回到主菜单 2.继续录入新大学的数据");
            scanf_s("%d", &h);
            if (h == 1) 
            {
                continue;
            }
        }
    }

    return 0;
}

根据您提供的代码,可以看到其中使用了scanf_s函数,该函数需要三个参数:第一个参数为要读取的输入格式字符串,第二个参数为要读取的变量,第三个参数为该变量的大小。但是,在您的代码中,第三个参数在scanf_s函数中被省略了。

因此,您需要在scanf_s函数中添加第三个参数,即要读取的变量的大小,例如:


scanf_s("%d", &h, sizeof(h));

此外,您的代码中使用了strcpy_s函数进行字符串拷贝操作,但是该函数也需要指定要拷贝的字符串的大小,因此您需要在strcpy_s函数中添加第三个参数,这样可以避免内存溢出等问题。

另外,您的程序中使用了一些可能会导致死循环或者数组越界的代码,比如在输入大学名称时没有增加对数组下标的限制,这可能会导致数组越界的问题。建议您在写代码时要注意这些细节问题。

【由 http://www.gpt100.chat/ 生成,人工整理】

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7440869
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?
  • 除此之外, 这篇博客: C++最重要的知识点,学弟学妹现在搞起,进大厂必备!中的 类与面向对象 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    1. 面向对象的三大特性:封装、继承、多态
    2. 类的访问权限:private、protected、public
    3. 类的构造函数、析构函数、赋值函数、拷贝函数
    4. 移动构造函数与拷贝构造函数对比
    5. 深拷贝与浅拷贝的区别
    6. 空类有哪些函数?空类的大小?
    7. 多态:动态多态、静态多态
    8. 虚函数实现动态多态的原理、虚函数与纯虚函数的区别
    9. 继承时,父类的析构函数是否为虚函数?构造函数能不能为虚函数?为什么?
    10. 静态多态:重写、重载、模板
  • 您还可以看一下 李云生老师的C++程序员内功修炼之道课程中的 程序加工厂之编译器小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    答案:

    根据您提供的问题描述和代码,我认为问题可能出在输入大学名称时遇到空格的情况下。

    在C++中,cin默认以空格作为输入分隔符,所以如果您输入的大学名称中包含空格,cin会将空格之前的部分作为输入,而忽略之后的部分。

    为了解决这个问题,您可以使用getline函数来获取整行输入,而不仅仅是使用cin来获取单个字符串。

    下面是修改后的代码:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
        string university;
        cout << "请输入大学名称:";
        getline(cin, university);
        cout << "您输入的大学是:" << university << endl;
        return 0;
    }
    

    在这个修改后的代码中,我添加了<string>头文件来使用string类型,并使用getline(cin, university)来获取整行输入。

    这样修改后,您就可以输入包含空格的大学名称,并正确地输出了。

    希望这个解决方案对您有帮助!如果有任何其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^