|
1鱼币
代码调了好几天调不出来,主要有以下几个问题
1、用结构体数组的话在打印时会出现访问冲突(如下代码)
2、用链表的话,最后打印出来的class和occupation为符号和数字(即不正确)
#include<stdio.h>
#include<stdlib.h>
#include<String.h>
#define NUM 2
#define LEN sizeof(struct Info)
#define N 100
#define O 4
//学生基本信息
typedef struct Info{
int num;
char *name;
char sex;
char job;
union {
int class;
char occupation[O];
};
}temp;
struct Info input(temp Information);
void print(struct Info p[]);
int main() {
struct Info Information[NUM];
for (int i = 0; i < NUM; i++)
{
input(Information[i]);
}
print(Information);
}
//输入学生基本信息
struct Info input(temp Information){
char str[N];
printf("Please give me the num:");
scanf("%d", &Information.num);
getchar();
printf("Please give me the name:");
gets(str);
Information.name = (char*)malloc(sizeof(str) + 1);
strcpy(Information.name, str);
printf("Please give me the sex(M/F):");
scanf_s("%c", &Information.sex);
getchar();
printf("Please give me the job(s/t):");
scanf("%c", &Information.job);
if (Information.job == 's') {
printf("Please give me the class:");
scanf("%d", &Information.class);
}
else if (Information.job == 't') {
printf("Please give me the occupation:");
char str2[O];
getchar();
gets(str2);
strcpy(Information.occupation, str2);
}
else {
printf("输入错!");
return;
}
printf("\n");
}
//打印学生基本信息
void print(struct Info p[]) {
printf("num\tname\tsex\tjob\tclass/occupation\n");
int i = 0;
while (i < NUM) {
if (p[i].job == 't') {
printf("%d\t%s\t%c\t%c\t%d\n", p[i].num, p[i].name, p[i].sex, p[i].job, p[i].class);
}
else {
printf("%d\t%s\t%c\t%c\t", p[i].num, p[i].name, p[i].sex, p[i].job);
puts(p[i].occupation);
}
i++;
}
}
以下是对您的代码出现问题的分析和修改建议:
1. **访问冲突问题:**
- 访问冲突可能是由于在输入和操作字符数组时,您使用 `char *` 而没有正确地分配内存或处理字符串。
- 在 `input` 函数中, `str` 是一个单字符变量,而不是字符串数组。应使用字符数组来读取和存储字符串。
2. **链表中的错误数据:**
- 在访问和使用字符串或未正确初始化的结构时可能会出现此类问题。
以下是修正后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 2
#define N 100
typedef struct Info{
int num;
char name[N];
char sex;
char job;
union {
int class;
char occupation[N];
};
} Info;
void input(Info *information);
void print(Info p[], int n);
int main() {
Info information[NUM];
for (int i = 0; i < NUM; i++) {
input(&information[i]);
}
print(information, NUM);
return 0;
}
//输入学生基本信息
void input(Info *information){
printf("Please give me the num: ");
scanf("%d", &information->num);
getchar();
printf("Please give me the name: ");
fgets(information->name, N, stdin);
information->name[strcspn(information->name, "\n")] = '\0'; // Remove newline
printf("Please give me the sex(M/F): ");
scanf("%c", &information->sex);
getchar();
printf("Please give me the job (s/t): ");
scanf("%c", &information->job);
if (information->job == 's') {
printf("Please give me the class: ");
scanf("%d", &information->class);
getchar();
}
else if (information->job == 't') {
printf("Please give me the occupation: ");
getchar();
fgets(information->occupation, N, stdin);
information->occupation[strcspn(information->occupation, "\n")] = '\0'; // Remove newline
}
else {
printf("输入错误!\n");
}
printf("\n");
}
//打印学生基本信息
void print(Info p[], int n) {
printf("num\tname\tsex\tjob\tclass/occupation\n");
for (int i = 0; i < n; i++) {
if (p[i].job == 't') {
printf("%d\t%s\t%c\t%c\t%s\n", p[i].num, p[i].name, p[i].sex, p[i].job, p[i].occupation);
} else {
printf("%d\t%s\t%c\t%c\t%d\n", p[i].num, p[i].name, p[i].sex, p[i].job, p[i].class);
}
}
}
**修改说明:**
- 使用字符数组 `char name[N]` 和 `char occupation[N]` 以避免动态分配字符串引起的错误。
- `fgets()` 用于读取字符串,以防止缓冲区溢出,并除去换行符。
- **建议:** 在遇到涉及动态内存和字符串操作时,小心使用指针和内存管理,以避免常见错误。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
最佳答案
查看完整内容
以下是对您的代码出现问题的分析和修改建议:
1. **访问冲突问题:**
- 访问冲突可能是由于在输入和操作字符数组时,您使用 `char *` 而没有正确地分配内存或处理字符串。
- 在 `input` 函数中, `str` 是一个单字符变量,而不是字符串数组。应使用字符数组来读取和存储字符串。
2. **链表中的错误数据:**
- 在访问和使用字符串或未正确初始化的结构时可能会出现此类问题。
以下是修正后的代码:
** ...
|