重要点:(为什么
这是我的完整代码,它看起来可以工作,但它工作得不是很好。 我会接受任何像这样工作的代码。
首先,代码有效,但是当我想将第三个名称添加到结构中时,它崩溃了。
还有其他方法可以做到这一点吗?
我需要结构,因为将来我想添加一些其他参数,如年龄、平均值、性别等。
请帮帮我。
//The student table
typedef struct students {
char name[50];
} students;
//Global params
int scount = 0;
students *s;
//Basic functions
void addNewStudent();
int main()
{
int loop = 1;
char in;
int ch;
printf("Willkommen.n Wahlen Sie bitte von die folgenden Optionen:n");
while (loop)
{
printf("t[1] Neue Student eingebenn");
printf("t[9] Programm beendenn");
scanf(" %c", &in);
while ((ch = getchar()) != 'n');
switch (in)
{
case '1':
addNewStudent();
break;
case '9':
loop = 0;
break;
default: printf("------nOption nicht gefunden.n------n");
break;
}
}
free(s);
return 0;
}
void addNewStudent()
{
int index = 0;
if (scount == 0)
{
s = (students*)malloc(sizeof(students));
}
else
{
realloc(s, sizeof(students) * scount);
}
printf("Geben Sie Bitte die Name:n");
fgets(s[scount].name, sizeof(s[scount].name), stdin);
while (s[scount].name[index] != 'n')
{
index++;
}
s[scount].name[index] = ' ';
scount++;
}
我正在使用Visual Studio。
感谢您的帮助!
students *mynew= realloc(s, sizeof(students)* (scount+1));
if( mynew != NULL )
s=mynew;
Otehrwise,您有内存泄漏。您没有使用realloc
的返回值。
不要强制转换返回类型malloc
。
根据标准§7.22.2.35
void *realloc(void *ptr, size_t size)
realloc
函数解除分配ptr
和 指向的旧对象 返回指向大小由size
指定的新对象的指针。
最好不要使用调用malloc
的同一指针变量,因为如果它失败,您也将失去对旧变量的引用(除非它通过其他方式存储)。
您也没有检查malloc
的返回值。
s = malloc(sizeof(students));
if( s == NULL ){
frpntf(stderr,"%s","Memory allocation failed");
exit(1);
}
此外,您还应该检查fgets()
的返回值。
if( fgets(s[scount].name, sizeof(s[scount].name), stdin) == NULL){
fprintf(stderr,"%s","Error in input");
exit(1);
}
还尝试编译您的代码,它显示了这一点
warning: ignoring return value of ‘realloc’, declared with attribute warn_unused_result [-Wunused-result] realloc(s, sizeof(students) * scount); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
编译时尽量不要忽略任何警告消息。它显示了您遇到的问题。
重要点:(为什么scount+1
realloc
?
重新分配时,总体思路是增加学生人数。为此,您需要为学生分配额外的内存。这就是代码中scount+1
的原因。(realloc
)。
其他几点:
while (s[scount].name[index] != 'n')
{
index++;
}
s[scount].name[index] = ' ';
你也可以这样做
size_t len = strlen(s[scount].name);
if(len){
s[scount].name[len-1]=' ';
}
从标准§7.21.7.2了解原因
char *fgets(char * restrict s, int n,FILE * restrict stream)
fgets
函数读取的读数最多比 由stream
into 指向的流中的n
指定的字符s
指向的数组。在 换行符(保留)或文件末尾之后。空值 字符在读入的最后一个字符之后立即写入 数组。
输入string
中已经存在