试图理解我的C代码中的问题

问题描述 投票:0回答:1

我创建了具有4个功能的代码:

  1. Data_duplication,用于检查名称是否已经存在。

  2. Init该函数通过用户输入来初始化一组名称和一组乐谱。两个大小相同的数组称为大小。每当为数组收集数据时,它们必须有效。如果用户键入了无效的名称,则应打印一条错误消息,并请求其他统计信息。有效分数在0到100之间完成。有效名称符合以下条件:

    • 以大的拉丁字母开头。
    • 除了第一个字符外,所有字符均为小写拉丁字符。
    • 尚未在数组中。 (该数组不能两次包含相同的名称。)
  3. 查找函数,以参数的形式获取名称数组,等级数组以及这些数组的大小。另外,它接收作为学生姓名参数。该函数在名称数组中查找学生的位置,并返回其成绩。如果学生未出现在集合中,则将返回1-。

  4. FreeAll从阵列中释放所有内存。

问题:例如,当我输入有3个学生时,它要求我写第4个学生,然后写出一个我从哪里不知道的成绩,然后退出程序。

代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define SIZE 20

int Data_duplication(char* temp, char** names, int line);
void Init(char*** names, int** grades, int* size);
int Find(char** names, int* grades, int size, char* name);
void FreeAll(char*** names, int** grades, int size);
int main()
{
    char** Names = NULL;
    int* Grades = NULL;
    int size, grade;
    char name[SIZE] = { 0 };
    Init(&Names, &Grades, &size);
    printf("Enter a student name\n");
    scanf("%s", name);
    grade = Find(Names, Grades, size, name);
    printf("%d", grade);
    FreeAll(&Names, &Grades, size);
    return 0;

}
void Init(char*** names, int** grades, int* size)
{
    int i, j, flag;
    int strlengh;
    char temp[SIZE] = { 0 };
    printf("Enter number of students\n");
    scanf("%d", size);
    *names = (char**)malloc((*size) * sizeof(char*));
    if (!(*names))
    {
        printf("Error");
        return;
    }
    *grades = (int*)malloc((*size) * sizeof(int));
    if (!*grades)
    {
        printf("Error");
        return;
    }
    for (i = 0; i < *size; i++)
    {
        printf("Enter a name\n");
        scanf("%s", temp);
        strlengh = strlen(temp);
        do
        {
            flag = 1;
            if (strlen(temp) > 20)//if it longer then it should be
                flag = 0;
            if (temp[0] > 'Z' || temp[0] < 'A') //start with capital letter
                flag = 0;
            for (j = 1; temp[j] != '\0'; j++)//all the letter is a lower case letters except from the first
            {
                if (temp[j] > 'z' || temp[j] < 'a')
                {
                    flag = 0;
                    break;
                }
            }
            if (Data_duplication(temp, *names, i))//if its not a name that already entered
            {
                flag = 0;
            }
            if (flag)//if the name is ok
            {
                (*names)[i] = (char*)malloc((strlengh + 1) * sizeof(char));
                if (!(*names)[i])
                {
                    printf("Error");
                    return;
                }
                strcpy((*names)[i], temp);
            }
            else//if somthing wrong
            {
                printf("Bad name,try again.\n");
                scanf("%s", temp);
            }
        } while (!flag);

        printf("Enter grade\n");
        scanf("%d", (*grades + i));
        while (*(*grades + i) < 0 || *(*grades + i) > 100)//if the grade between 0 to 100
        {
            printf("Bad grade,try again.\n");
            scanf("%d", (*grades + i));
        }
    }

}
int Data_duplication(char* temp, char** names, int line)//find if there is another name like this that already entered
{
    for (int i = 0; i < line; i++)
    {
        if (!strcmp(temp, names[i]))
        {
            return 1;
        }
    }
    return 0;
}
int Find(char** names, int* grades, int size, char* name)
{
    int i;
    for (i = 0; i < size; i++)
    {
        if (strcmp(name, names[i]) == 0);
        {
            return (*(grades + i));
        }
    }
    return -1;
}
void FreeAll(char*** names, int** grades, int size)//free al the dynamic memo allocation
{
    for (int i = 0; i < size; i++)
    {
        free(*(*names + i));
    }
    free(*names);
    free(*grades);

}
c arrays visual-studio function allocation
1个回答
0
投票

通过引用传递的数组,因此您无需将指针传递给数组。我对您的代码进行了更改。

#include <stdio.h>
#include <stdlib.h>
#include<malloc.h> 
#include<string.h>
#define SIZE   20
int Data_duplication(char* temp, char** names, int line);
void Init(char** names, int* grades, int size);
int Find(char** names, int* grades, int size, char* name);
void FreeAll(char** names, int* grades, int size);
int main()
{

    int size, grade;
    char name[SIZE];
    printf("Enter number of students\n");
    scanf("%d", &size);
    char** Names=(char**)malloc((size) * sizeof(char*));
    int* Grades= (int*)malloc((size) * sizeof(int));
    Init(Names, Grades, size);
    printf("--------------------------------------------------------------------\n");
    printf("Enter a student name\n");
    scanf("%s",name);
    grade = Find(Names,Grades,size,name);
    printf("%d", grade);
    FreeAll(Names, Grades, size);
    return 0;

}
void Init(char** names, int* grades, int size)
{
    int i, j, flag;
    int strlengh;
    if (!(names))
    {
        printf("Error");
        return;
    }
    for(i = 0; i < size ; i++){
        names[i] = malloc(sizeof(char)*SIZE);
        if(!names[i])
        {
            printf("Error");
            return;
        }
    }
    if (!grades)
    {
        printf("Error");
        return;
    }
    for (i = 0; i < size; i++)
    {
     printf("Student i= %d\n",i); 
        do
        {
            char temp[SIZE]="";

            printf("Enter a name\n");
            scanf("%s", temp);

            strlengh = strlen(temp);
            flag = 1;
            if (strlen(temp) > SIZE)//if it longer then it should be
                flag = 0;
            if (temp[0] > 'Z' || temp[0] < 'A') //start with capital letter
                flag = 0;
            for (j = 1; temp[j] != '\0'; j++)//all the letter is a lower case letters except from the first
            {
                if (temp[j] > 'z' || temp[j] < 'a')
                {
                    flag = 0;
                    break;
                }
            }
            if (Data_duplication(temp, names, i))//if its not a name that already entered
            {
                flag = 0;
            }
            if (flag)//if the name is ok
            {
              strcpy(names[i], temp);
              printf("temp= %s\n", temp);
              printf("names[i]= %s\n", names[i]);


            }
            else//if somthing wrong
            {
                printf("Bad name,try again.\n");
            }
        } while (!flag);

        printf("Enter grade\n");
        scanf("%d",&grades[i]);
        while (grades[i] < 0 || grades[i] > 100)//if the grade between 0 to 100
        {
            printf("Bad grade,try again.\n");
            scanf("%d",&grades[i]);

        }
    }

}
int Data_duplication(char* temp, char** names, int line)//find if there is another name like this that already entered
{
    for (int i = 0; i < line; i++)
    {
        if (!strcmp(temp, names[i]))
        {
            return 1;
        }
    }
    return 0;
}
int Find(char** names, int* grades, int size, char* name)
{
    int i;
    for (i = 0; i < size; i++)
    {
        printf("name= %s\n",name);
        printf("names[i]= %s\n", names[i]);
        if (strcmp(name, names[i]) == 0)
        {
            return (grades[i]);
        }
    }
    return -1;
}
void FreeAll(char** names, int* grades, int size)//free al the dynamic memo allocation
{
    for (int i = 0; i < size; i++)
    {
        free(names[i]);
    }
    free(names);
    free(grades);

}
© www.soinside.com 2019 - 2024. All rights reserved.