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