C语言中输入字符串数组的内存管理

C语言中输入字符串数组的内存管理,c,arrays,pointers,C,Arrays,Pointers,这是我关于堆栈溢出的第一篇文章,我想为我的英语道歉,因为我不是以英语为母语的人。无论如何,我几乎自学了编程,所以显然我不是很擅长。为了获得一些经验,我参加了一些编程练习(从大学里的一个朋友那里得到的),但我遇到了一个问题。本练习要求创建一个由用户提供的10个名称组成的数组,其中一个包含他们的销售额。程序应该将第一个数组的内容传递到另外两个数组中,一个数组的名称管理了6000多个销售,另一个数组的名称没有管理过6000多个销售。第一个阵型上的玩家获得500奖金,其他玩家获得200奖金。该程序应该计

这是我关于堆栈溢出的第一篇文章,我想为我的英语道歉,因为我不是以英语为母语的人。无论如何,我几乎自学了编程,所以显然我不是很擅长。为了获得一些经验,我参加了一些编程练习(从大学里的一个朋友那里得到的),但我遇到了一个问题。本练习要求创建一个由用户提供的10个名称组成的数组,其中一个包含他们的销售额。程序应该将第一个数组的内容传递到另外两个数组中,一个数组的名称管理了6000多个销售,另一个数组的名称没有管理过6000多个销售。第一个阵型上的玩家获得500奖金,其他玩家获得200奖金。该程序应该计算他们奖金的总公司成本,并将其打印在屏幕上。程序还应打印两个名称数组

更新:我决定先不使用动态内存分配来解决问题。因此,这是完美的工作方式,但出于某种原因,它会一直打印姓氏,而不是每个姓氏

#include <stdio.h>
#include <stdlib.h>
int c =0;
int x =0;
int i;
int sum_500 =0;
int sum_200 =0;
char* names_500[10];
char* names_200[10];
char* names[10];
int sales[10];
char buffer[200];
char trash[10];


int main() {

for (i =0; i<10; i++) {
    printf("Give name:");
    fgets(buffer,201,stdin);
    names[i] = buffer;
    printf("Give sales profit:");
    scanf("%d",&sales[i]);
    fgets(trash,11,stdin);
    if (sales[i] > 6000) {

        names_500[c] = names[i];
        sum_500 = sum_500 + 500;
        c++;
    }
    else {

        names_200[x] = names[i];
        sum_200 = sum_200 + 200;
        x++;
    }
}
if( c>0) {
        for(i =0; i<c; i++) {
        printf("%s\n",names_500[i]);
        }
}

if (x>0) {
        for(i =0; i<x; i++) {
        printf("%s\n",names_200[i]);
        }
}

printf("Company total bonus cost:%d",sum_200 + sum_500);
return 0;
}
#包括
#包括
int c=0;
int x=0;
int i;
int sum_500=0;
int sum_200=0;
字符*名称_500[10];
字符*名称_200[10];
字符*名称[10];
国际销售[10];
字符缓冲区[200];
煤焦垃圾[10];
int main(){
对于(i=0;i 6000){
姓名(c)=姓名(i);;
sum_500=sum_500+500;
C++;
}
否则{
名称_200[x]=名称[i];
sum_200=sum_200+200;
x++;
}
}
如果(c>0){
对于(i=0;i0){
对于(i=0;i0){
printf(“500奖金:\n”);
对于(i=0;i0){
printf(“200奖金:\n”);
对于(i=0;i
程序在输入第一个销售编号后崩溃

程序崩溃的原因在
scanf
的参数中缺少
&
。它应该是

 scanf("%d",&sales[i]);  
旁注
分配
名称[i]
没有用,因为分配的空间在
名称[i]=buffer;

names[i] = malloc(strlen(buffer));
names[i] = buffer;  
对于
名称\u 500[c]

names_500[c] = malloc(strlen(names[i]));
names_500[c] = names[i];  

使用调试器(或valgrind)找出崩溃的位置。非常感谢!这修复了第一次崩溃。现在发生的情况是,它进入循环3次,同时忽略了给定名称输入,然后崩溃。是stdin缓冲区吗?Put{….fflush(stdin);…}就在循环开始时,看看问题是否得到解决。@RafedNole;使用
fflush(stdin)
调用未定义的行为,除非您在MS-DOS上。我在gcc(ubuntu)中使用过它,但它没有。我将检查它。现在循环工作,但程序自动崩溃,似乎它没有将名称正确地传递给2个数组。
names_500[c] = malloc(strlen(names[i]));
names_500[c] = names[i];