Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 输入超过6个用户的值后,程序停止工作_C - Fatal编程技术网

C 输入超过6个用户的值后,程序停止工作

C 输入超过6个用户的值后,程序停止工作,c,C,我有一个学校项目,要求我使用struct和functions编写一个关于希腊城市销售的代码。系统会提示您输入它们的值。如果我输入有6名销售人员,则该程序工作正常,但如果输入的值大于该值,则会在输入所有值后停止。。例如: 销售人员人数:7人 ( 输入his id: 输入他的姓氏: 输入销售数量: 输入区号: )x7次 然后,当您输入最后一个值时,它将停止。不退出,不停止响应/崩溃,完全停止,您将无法再键入任何内容,唯一的选项是退出 问题是,构建消息和日志中都没有错误或警告,这让我很困惑 我猜错误在

我有一个学校项目,要求我使用struct和functions编写一个关于希腊城市销售的代码。系统会提示您输入它们的值。如果我输入有6名销售人员,则该程序工作正常,但如果输入的值大于该值,则会在输入所有值后停止。。例如:

销售人员人数:7人

(

  • 输入his id:

  • 输入他的姓氏:

  • 输入销售数量:

  • 输入区号:

  • )x7次

    然后,当您输入最后一个值时,它将停止。不退出,不停止响应/崩溃,完全停止,您将无法再键入任何内容,唯一的选项是退出

    问题是,构建消息和日志中都没有错误或警告,这让我很困惑

    我猜错误在函数“calcSales”中,但我想发布整个代码,以防您需要更多信息

    你能看一下密码并告诉我你是否发现什么错误吗?多谢各位

    #include <stdio.h>
    #include "genlib.h"
    #include <simpio.h>
    #include <string.h>
    #define N 20
    #define M 4
    
    struct{
         int id;
         char surname[16];
         long sales;
         int area;
    } salesmen[N];
    
    void info(int *count);
    void calcSales(int *count);
    
    int main(){
    
         int count;
    
         printf("Give me the number of salesmen:\n");
         count=GetInteger();
    
         info(&count);
    
         calcSales(&count);
    }
    
    void info(int *count){
    
    for (int i=0; i<*count; i++){
        printf("\nInfo for salesman number %d:\n", i+1);
    
        printf("\nGive me his id: ");
            salesmen[i].id=GetInteger();
    
        printf("\nGive me his surname: ");
            gets(salesmen[i].surname); 
    
        printf("\nGive me the number of sales: ");
            salesmen[i].sales=GetLong();
    
        printf("\n 1=Thessaloniki, 2= Athens, 3= Volos, 4= Hrakleio \n");
        printf("\nLastly, give me the number of his area: ");
            salesmen[i].area=GetInteger();
    
        if (salesmen[i].area>4){
            printf("\nThe number you are trying to enter doesn't match to an area.\n");
            break;
            }
        }
    }
    
    void calcSales(int *count){
    
    
        long tSales[4];
        for (int i=0; i<*count; i++){
        tSales[i]=0;
        }
    
    for (int i=0; i<*count; i++){
    
        if(salesmen[i].area==1){
                tSales[0]+=salesmen[i].sales;
            }
        if(salesmen[i].area==2){
                tSales[1]+=salesmen[i].sales;
            }
        if(salesmen[i].area==3){
                tSales[2]+=salesmen[i].sales;
            }
        if(salesmen[i].area==4){
                tSales[3]+=salesmen[i].sales;
        }
    }
    
    for (int i=0; i<4; i++){
        printf("\nSales for area number %d: %ld\n",i+1, tSales[i]);
        }
    }
    
    #包括
    #包括“genlib.h”
    #包括
    #包括
    #定义n20
    #定义M4
    结构{
    int-id;
    查氏[16];
    长期销售;
    内部区域;
    }推销员;
    无效信息(整数*计数);
    作废计算销售额(整数*计数);
    int main(){
    整数计数;
    printf(“告诉我销售人员的数量:\n”);
    count=GetInteger();
    信息和计数;
    计算销售额(&count);
    }
    无效信息(整数*计数){
    对于(int i=0;i4){
    printf(“\n您试图输入的数字与区域不匹配。\n”);
    打破
    }
    }
    }
    作废计算销售额(整数*计数){
    长沙莱斯[4];
    
    对于(int i=0;i您的猜测是正确的。
    calcSales
    函数中的错误

    确切地说,以下部分:

    long tSales[4];
    
    对于(int i=0;i查看
    tSales
    中有多少元素,然后查看将其归零的循环中正在访问的元素数量。避免此问题的最佳方法是正确初始化数组–
    long tSales[4]={0};
    –而不是使用“声明,然后分配”方法。最后一件事,请不要使用
    get
    @RahulBharadwaj,完全同意!这可能会导致缓冲区溢出。但对于刚刚开始学习C的人来说,这有点高级。@RahulBharadwaj我们已经学会了strncpy和get,但对我来说,变得真的容易多了!你认为strncpy版本可以更好更简单吗对于初学者来说,buggy更少了?您好,您能为
    gets
    部分(不使用
    scanf
    )显示一个小的替换代码吗。非常感谢您帮助我解决这个问题,同时也感谢您展示了所有可能的方法。干杯!!@RahulBharadwaj,就个人而言,我更喜欢使用FGET。scanf和GET都不安全。FGET是安全的。原因可以单独解释。但所有的事情都与缓冲区溢出有关